¡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> p>
f.setVisible(true);
}
}
clase CVS extiende Component implementa ComponentListener, MouseListener, MouseMotionListener{ p>
public void componenteHidden(ComponentEvent e) {}
public void componenteMoved(ComponentEvent e) {}
public void componenteResized(ComponentEvent e) {resized();} p>
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> 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(){ p>
sa.ss.clear();
c.repaint();
}
público estático void cp() { p>
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>
} 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); p>
oos.flush( );
oos.c
perder();
}catch(Excepción e){}
}
}
carga vacía estática(){ p>
int x=jfc.showOpenDialog(c);
if(x==JFileChooser.APPROVE_OPTION){
Archivo f = jfc.getSelectedFile(); p>
p>
intentar{
ObjectInputStream oos=new ObjectInputStream(new FileInputStream(f));
Object r=oos.readObject(); p>
if(r!=null){
sa=(SA)r;
c.repaint();
} p>
oos.close();
}catch(Exception e){e.printStackTrace();}
}
} p>
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){ p>
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> 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){ p>
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
}
}
;