Red de conocimiento informático - Aprendizaje de programación - ¡Diseño de tablero de dibujo GUI (tablero de dibujo), escritura de código de programa en Java! ! ¡Gracias! !

¡Diseño de tablero de dibujo GUI (tablero de dibujo), escritura de código de programa en Java! ! ¡Gracias! !

Solo se pueden mover rectángulos y círculos. Otros son más problemáticos de implementar. Algunos métodos simplemente tienen demasiado código.

Dibujar arcos se cambia por dibujar arcos. Por supuesto, el método es muy simple.

Haz doble clic en cualquiera de los 13 colores y aparecerá un selector de color.

Tiene funciones de guardar y abrir. Utilice .jdr para la extensión.

Básicamente cumple con las condiciones. Los detalles pueden no ser muy buenos. Además, el código es un poco confuso y me temo que es difícil de entender.

importar java.awt.*;

importar java.awt.event.*

importar java.awt.geom.*;

importar java.awt.image.BufferedImage;

importar java.io.*;

importar java.util.ArrayList;

importar javax. swing.*;

importar javax.swing.filechooser.FileNameExtensionFilter;

clase pública JDraw {

public static void main(String[] args) {

JFrame f=new JFrame();

f.setDefaultCloseOperation(3

f.setSize(880, 600); > f.setLocationRelativeTo(null);

f.getContentPane().add(M.c);

f.getContentPane().add(M.m, "Sur"); p>

f.setVisible(true);

}

}

clase CVS extiende Component implementa ComponentListener, MouseListener, MouseMotionListener{

public void componenteHidden(ComponentEvent e) {}

public void componenteMoved(ComponentEvent e) {}

public void componenteResized(ComponentEvent e) {resized();}

public void componenteShown(ComponentEvent e) {}

private void resized() {

int w=this.getWidth();

int h=this.getHeight();

tbuff=new BufferedImage(w, h, 3);

makeBuff(w, h). > }

private void makeBuff(int w, int h) {

Gráficos g = tbuff.getGraphics()

g.drawImage(buff, 0; , 0 , nulo);

g.dispose();

buff=new BufferedImage(w, h, 3);

g=buff.getGraphics () ;

g.drawImage(tbuff, 0, 0, nulo

g.dispose()

}

BufferedImage, tbuff;

CVS(){

this.addComponentListener(this

this.addMouseListener(this); > this.addMouseMotionListener(this);

buff=new BufferedImage(1, 1, 3);

}

pintura vacía pública (Gráficos gr){

Graphics2D g = buff.createGraphics();

g.setBackground(new Color(0xff000000, true));

g.clearRect(0, 0 , getWidth(), getHeight());

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON

M.sa.drawAll( g);

if(M.ts!=null)

M.ts.draw(g);

g.dispose(); p>

gr.drawImage(buff, 0, 0, esto);

gr.dispose();

}

public void; mouseClicked( MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed( MouseEvent e ) {

M.mp(e.getPoint());

}

public void mouseReleased(MouseEvent e) {

M.mr(e.getPoint());

}

public void mouseDragged(MouseEvent e) {

M.md(e.getPoint () );

}

public void mouseMoved(MouseEvent e) {}

}

El menú de clase extiende JComponent implementa MouseListener, ActionListener{

JComboBox sbox, método

CLabel[] cl

JCheckBox fillC, drawB

JRadioButton fc;

p>

ButtonGroup bg;

JButton borrar, arriba, abajo, guardar, cargar

Menú(){

este.setL

ayout(new FlowLayout());

método=new JComboBox(new Object[]{"dibujar", "mover", "borrar",

agregar(método).

sbox=new JComboBox(new Object[]{"Pt", "Ln", "Rect", "Cir", "Arc", }); (sbox);

cl=new CLabel[13];

for(int i=0; ilt; cl.length; i){

cl [i]=new CLabel();

cl[i].addMouseListener(this);

add(cl[i]);

}

fc=new JRadioButton("fc", true);

bc=new JRadioButton("bc");

bg=new ButtonGroup();

bg.add(fc); bg.add(bc);

agregar(fc); agregar(bc);

fc.setOpaque(true) ;

bc.setOpaque(true);

fc.setBackground(Color.white);

bc.setBackground(Color.blue);

fillC=new JCheckBox("Fill", true);

drawB=new JCheckBox("Draw", true);

fillC.addActionListener(this);

drawB.addActionListener(this);

add(fillC); add(drawB);

clear=new JButton("clear");

clear.addActionListener(this);

add(clear);

up=new JButton("zUp"); (esto);

agregar(arriba);

abajo=new JButton("zDown");

abajo.addActionListener(esto); >

agregar(abajo);

guardar=new JButton("Guardar");

save.addActionListener(this);

cargar=new JButton("Cargar");

load.addActionListener(this); p> }

public void mouseClicked(MouseEvent e) {

JLabel l=(JLabel)e.ge

tSource();

if(e.getClickCount()==2){

Color sc=JColorChooser.showDialog(null, "Selector de color", l.getBackground()) ;

l.setBackground(sc);

mousePressed(e);

}

}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) {

Color c= ((JLabel)e.getSource()).getBackground();

if(fc.isSelected())

fc.setBackground(c);

else if(bc.isSelected())

bc.setBackground(c

M.cp()

}

<); p> public void mouseReleased(MouseEvent e) {}

public void actionPerformed(ActionEvent e) {

if(e.getSource()==clear)M.clear();

else if(e.getSource()==up)M.up();

else if(e.getSource()==down)M.down();

else if(e.getSource()==save)M.save();

else if(e.getSource()==load)M.load();

else if(e.getSource()==fillC||e.getSource()==drawB)M.cp();

}

}

clase CLabel extiende JLabel{

Color estático[] cs={Color.rojo, Color.naranja, Color.amarillo, Color.verde, Color.cian,

Color.azul, Color.magenta, Color.magenta.más brillante(),

Color.blanco, Color.negro, Color.gris, Color.GRIS_LUZ, Color.GRIS_OSCURO, };

static int i;

CLabel(){

this.setOpaque(true);

this.setBackground(cs[i] );

this.setBorder(BorderFactory.createLineBorder(Color.negro));

<

p> this.setPreferredSize(new Dimension(10, 20));

}

}

clase M{

JFileChooser estático jfc=nuevo JFileChooser();

Menú estático m=nuevo Menú();

CVS estático c=nuevo CVS();

SA estático sa= new SA();

static S ts=null, selected=null;

static Color fc, bc;

static void clear(){

sa.ss.clear();

c.repaint();

}

público estático void cp() {

System.out.println(seleccionado);

if(seleccionado!=null){

seleccionado.fillColor=m.fc.getBackground();

p>

selected.borderColor=m.bc.getBackground();

selected.fc=m.fillC.isSelected();

selected.db=m.drawB .isSelected();

c.repaint();

}

}

público estático void up() {

p>

if(seleccionado!=null){

sa.upZ(seleccionado

c.repaint(); /p>

}

}

vacío estático público abajo(){

if(seleccionado!=null){

sa.downZ(seleccionado);

c.repaint()

}

}

estático{

jfc.setFileFilter(new FileNameExtensionFilter ("archivo JDraw (*.jdraw, *.jdr)", "jdr", "jdraw")); void save(){

int x=jfc.showSaveDialog(c);

if(x==JFileChooser.APPROVE_OPTION){

Archivo f = jfc .getSelectedFile();

prueba{

ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));

oos.writeObject(sa);

oos.flush( );

oos.c

perder();

}catch(Excepción e){}

}

}

carga vacía estática(){

int x=jfc.showOpenDialog(c);

if(x==JFileChooser.APPROVE_OPTION){

Archivo f = jfc.getSelectedFile();

p>

intentar{

ObjectInputStream oos=new ObjectInputStream(new FileInputStream(f));

Object r=oos.readObject();

if(r!=null){

sa=(SA)r;

c.repaint();

}

oos.close();

}catch(Exception e){e.printStackTrace();}

}

}

static int mx, my, tx, ty, ox, oy

static int pc=0, pmax;

static int sm; p> static boolean ne =true;

static int mid;

static void mp(Punto p){

mid=m.method.getSelectedIndex() ;

if(mid==0){

if(ne){

mx=p.x; pc=0;

sm=m.sbox.getSelectedIndex();

pmax=sm==4?2:1;

ne=false;

}

pc;

}

else if(mid==1){

checkSel( p);

p>

mx=p.x;my=p.y;

}

else if(mid==2){

checkSel(p);

if(seleccionado!=null){

sa.ss.remove(seleccionado

c.repaint();

}

}

}

checkSel vacío estático privado (Punto p) {

seleccionado=null ;

for(int i=sa.ss.size(); igt; 0; i--)

if(sa.ss.get(i-1).shape .contiene(p)){

seleccionado=sa.ss.get(i-1;

}

sa.select(s);

elegido);

c.repaint();

}

static void mt(){

Forma s=null;

int cx, cy, cw, ch;

switch(sm){

caso 0:

caso 2:

cx=Math.min(mx, tx);

cy=Math.min(mi, ty

cw=Math.abs(mx-tx); ;

ch=Math.abs(my-ty);

if(sm==0)

s=new Ellipse2D.Double(cx,cy , cw, ch);

else

s=nuevo Rectángulo(cx, cy, cw, ch

break; > caso 1:

s=new Line2D.Float(mx, my, tx, ty

break

caso 3:

;

cw=Math.abs(mx-tx);

ch=Math.abs(my-ty);

int cd=(int)Math.sqrt(Matemáticas); .pow(mx-tx, 2) Math.pow(mi-ty, 2))*2

cx=mx-cd/2

cy=mi-cd; /2;

s=new Ellipse2D.Double(cx, cy, cd, cd);

descanso

caso 4:

Path2D p=new Path2D.Double();

p.moveTo(mx,my);

if(pc==1){

p.lineTo(tx, ty);

}

else{

p.quadTo(ox, oy, tx, ty);

}

s=p;

romper

}

ts=nuevo S(s, m.fc. getBackground(), m.bc.getBackground(), m.fillC.isSelected(), m.drawB.isSelected(), nulo

c.repaint(); > }

static void md(Punto p){

if(mid==0){

if(!sa.ss.isEmpty()) {

sa.ss.get(sa.ss.size()-1).sel=false

}

if(pcgt; 1) {

ox=p.x; oy=p.y;

}

else{

tx=p.x; p>

p>

}

mt();

}

else if(mid==1){

if(seleccionado!=null){

moveTo(seleccionado, p);

c.repaint() ;

}

}

else if(mid==2){

checkSel(p);

if(seleccionado!=null){

sa.ss.remove(seleccionado);

c.repaint();

}

}

}

movimiento vacío estático a (S s, punto p) {

if(s.shape instancia de rectángulo){

Rectángulo r=(Rectángulo)s.shape;

r.setLocation(r.x ​​​​p.x-mx, r.y p.y-my);

mx=p.x; =p.y ;

}

else if(s.shape instancia de Ellipse2D){

Ellipse2D e=(Ellipse2D)s.shape;

e.setFrame(e.getX() p.x-mx, e.getY() p.y-my, e.getWidth(), e.getHeight());

mx=p.x; p.y;

}

}

static void mr(Punto p) {

if(pc==pmax){

pc=0;

ne=true;

sa.add(ts);

seleccionado=ts; p> ts=null;

}

}

}

la clase S implementa Serializable{

booleano fc, db, sel=true;

Forma de forma

Color de relleno, color de borde

Trazo de trazo

Trazo estático; =new MyBasicStroke();

Trazo estático selectStroke=new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, new float[]{5, 2}, 1);

S(Forma s, Color c, Color b, booleano f, booleano d, Trazo k){

this.shape=s; this.fillColor=c; fc= f;this.db=d;this.stroke=k==null?bstroke:k;

}

void draw(Gráficos

2D g){

if(fc){

g.setColor(fillColor);

g.fill(forma);

}

if(db){

g.setColor(borderColor

g.setStroke(trazo);

g); .draw(forma);

}

if(sel){

g.setColor(Color.verde);

g .setStroke(selectStroke);

g.draw(shape.getBounds());

}

}

} p>

clase MyBasicStroke extiende BasicStroke implementa Serializable{}

clase SA implementa Serializable{

ArrayListlt; ss=new ArrayListlt (); p>

void add(S s){

if(s!=null){

for(S sx:ss)

sx. sel= false;

ss.add(s);

}

}

S eliminar(int i){

return ss.remove(i);

}

void remove(S s){

ss.remove(s);

}

void upZ(S s){

indexZ(s, 1);

}

anular abajoZ (S s){

indexZ(s, -1

}

anular indexZ(S s, int i) {

int si=ss.indexOf(s);

if(si ilt;0||si igt;ss.size()-1)return;

intercambiar (s , ss.get(si i));

}

intercambio vacío (S a, S b){

int ai=ss.indexOf (a );

int bi=ss.indexOf(b);

ss.set(ai, b

ss.set(bi, a) ;

}

void select(S s){

for(S x: ss)

x.sel= falso;

if(s!=null)

s.sel=true

}

void drawAll(Graphics2D g) {

for(S s:ss)

s.draw(g

}

}

;