Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JComponent中存储形状_Java_Swing_Arraylist - Fatal编程技术网

Java 在JComponent中存储形状

Java 在JComponent中存储形状,java,swing,arraylist,Java,Swing,Arraylist,我不确定如何使用一个shape类型的arraylist存储多个不同的形状。这是主要的 public class A1 { public static boolean rDraw = false; public static boolean eDraw = false; public static boolean lDraw = false; public static void main(String[] args) { JFrame frame = new JFrame();

我不确定如何使用一个shape类型的arraylist存储多个不同的形状。这是主要的

public class A1 {
public static boolean rDraw = false;
public static boolean eDraw = false;
public static boolean lDraw = false;
public static void main(String[] args) {
    JFrame frame = new JFrame();
    JButton rect = new JButton("Rectangle");
    rect.addActionListener(new ActionListener (){
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==rect){
                rDraw = true;
                eDraw = false;
                lDraw = false;
            }
        }
    });
    JButton ellipse = new JButton("Ellipse");
    ellipse.addActionListener(new ActionListener (){
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==ellipse){
                rDraw = false;
                eDraw = true;
                lDraw = false;      
            }
        }
    });
    JButton edge = new JButton("Edge");
    edge.addActionListener(new ActionListener (){
        public void actionPerformed(ActionEvent e){
            if(e.getSource() == edge){
                rDraw = false;
                eDraw = false;
                lDraw = true;       
            }
        }
    });
    JButton label = new JButton("Label");
    JTextField labelField = new JTextField(20);
    JPanel panel = new JPanel();
    panel.add(rect);
    panel.add(ellipse);
    panel.add(edge);
    panel.add(label);
    panel.add(labelField);
    frame.add(panel,BorderLayout.NORTH);
    JComponent canvas = new Canvas();
    frame.add(canvas,BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 600);
    frame.setTitle("Graph Draw");
    frame.setVisible(true);
    }
}
在我的画布上,我不确定如何使用drawShape?以及在paintComponent中放置什么来存储形状

public class Canvas extends JComponent {
private Point p,p2;
private Rectangle r;
private Ellipse2D ep;
private Line2D l;
ArrayList<Shape> shapes = new ArrayList<Shape>();

public Canvas(){
    class MyMouseListener implements MouseListener{
        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void mousePressed(MouseEvent e) {
            if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
                p = e.getPoint();
                r = new Rectangle(p.x, p.y, p.x - p.x, p.y - p.y);  
            }
            else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
                p = e.getPoint();
                ep = new Ellipse2D.Double(p.x, p.y, p.x - p.x, p.y - p.y);
            }
            else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
                p = e.getPoint();
                l = new Line2D.Double(p.x, p.y, p.x - p.x, p.y - p.y);
            }
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
                if (r.width != 0 || r.height != 0)
                {
                    addRectangle(r);
                }

                r = null;
            }
            else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
                if (ep.getWidth() != 0 || ep.getHeight() != 0){
                    addEllipse(ep);
                }
                ep = null;
            }
            else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
                if (l.getP1() != null || l.getP2() != null){
                    addLine(l);
                }
                l = null;
            }
        }
    }
    class MyMouseMotionListener implements MouseMotionListener{
        @Override
        public void mouseDragged(MouseEvent e) {
            if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
                int x = Math.min(p.x, e.getX());
                int y = Math.min(p.y, e.getY());
                int width = Math.abs(p.x - e.getX());
                int height = Math.abs(p.y - e.getY());
                r.setBounds(x, y, width, height);
                repaint();
            }
            else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
                int x = Math.min(p.x, e.getX());
                int y = Math.min(p.y, e.getY());
                int width = Math.abs(p.x - e.getX());
                int height = Math.abs(p.y - e.getY());
                ep.setFrame(x, y, width, height);
                repaint();
            }
            else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
                p2 = e.getPoint();
                l.setLine(p, p2);
                repaint();
            }
        }
        @Override
        public void mouseMoved(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
    }
    MouseListener mListener = new MyMouseListener();
    addMouseListener(mListener);
    MouseMotionListener mmListener = new MyMouseMotionListener();
    addMouseMotionListener(mmListener);
}
public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for (Shape shape:shapes){

    }
    if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
        g2d.draw(r);
    }
    else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
        g2d.draw(ep);
    }
    else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
        g2d.draw(l);
    }
}
public void addRectangle(Rectangle rect){
    if(r != null){
        Rectangle cR = new Rectangle(rect);
        shapes.add(cR);
        repaint();
    }
}
public void addEllipse(Ellipse2D ellipse){
    if (ep != null){
        Ellipse2D cEp = new Ellipse2D.Double(ellipse.getX(),ellipse.getY(),ellipse.getWidth(),ellipse.getHeight());
        shapes.add(cEp);
        repaint();
    }
}
public void addLine(Line2D line){
    if(l != null){
        Line2D cL = new Line2D.Double(line.getP1(), line.getP2());
        shapes.add(cL);
        repaint();
    }
}
}
公共类画布扩展JComponent{
专用点p,p2;
私有矩形r;
私人Ellipse2D ep;
私人专线;
ArrayList形状=新的ArrayList();
公共画布(){
类MyMouseListener实现MouseListener{
@凌驾
公共无效鼠标单击(鼠标事件arg0){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标事件(鼠标事件arg0){
//TODO自动生成的方法存根
}
@凌驾
public void mouseexitted(MouseEvent arg0){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标按下(MouseEvent e){
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
p=e.getPoint();
r=新矩形(p.x,p.y,p.x-p.x,p.y-p.y);
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
p=e.getPoint();
ep=新的椭圆2倍(p.x,p.y,p.x-p.x,p.y-p.y);
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
p=e.getPoint();
l=新线2D.双(p.x,p.y,p.x-p.x,p.y-p.y);
}
}
@凌驾
公共无效MouseEvent(MouseEvent e){
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
如果(r.宽度!=0 | | r.高度!=0)
{
添加矩形(r);
}
r=null;
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
如果(ep.getWidth()!=0 | | ep.getHeight()!=0){
加法器(ep);
}
ep=零;
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
if(l.getP1()!=null | | l.getP2()!=null){
addLine(l);
}
l=零;
}
}
}
类MyMouseMotionListener实现MouseMotionListener{
@凌驾
公共无效鼠标标记(鼠标事件e){
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
intx=Math.min(p.x,e.getX());
inty=Math.min(p.y,e.getY());
int width=Math.abs(p.x-e.getX());
int height=Math.abs(p.y-e.getY());
r、 立根(x、y、宽度、高度);
重新油漆();
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
intx=Math.min(p.x,e.getX());
inty=Math.min(p.y,e.getY());
int width=Math.abs(p.x-e.getX());
int height=Math.abs(p.y-e.getY());
ep.设置框(x、y、宽度、高度);
重新油漆();
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
p2=e.getPoint();
l、 设定线(p,p2);
重新油漆();
}
}
@凌驾
public void mouseMoved(MouseEvent arg0){
//TODO自动生成的方法存根
}
}
MouseListener mListener=新的MyMouseListener();
addMouseListener(mListener);
MouseMotionListener mmListener=新的MyMouseMotionListener();
addMouseMotionListener(mmListener);
}
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
用于(形状:形状){
}
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
g2d.绘图(r);
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
g2d.draw(ep);
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
g2d.图纸(l);
}
}
公共void addRectangle(矩形rect){
如果(r!=null){
矩形cR=新矩形(rect);
形状。添加(cR);
重新油漆();
}
}
公共无效加法器(椭圆E2D椭圆){
如果(ep!=null){
Ellipse2D cEp=新的Ellipse2D.Double(椭圆.getX(),椭圆.getY(),椭圆.getWidth(),椭圆.getHeight());
形状。添加(cEp);
重新油漆();
}
}
公共无效添加线(Line2D线){
如果(l!=null){
Line2D cL=newline2d.Double(line.getP1(),line.getP2());
形状。添加(cL);
重新油漆();
}
}
}

您的paintComponent方法似乎做得太多太少:太少的原因是它没有绘制形状,太多的原因是它试图使用静态布尔字段来做它不应该做的事情

“…以及在paintComponent中放置什么来存储形状。”

这不应该是paintComponent方法的一部分。此方法仅用于在零部件上绘制项目。它不应用于程序逻辑。存储形状的代码应该在鼠标侦听器类型代码中,而不是在paintComponent中

我认为您在paintComponent中所需要的只是:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for (Shape shape : shapes) {
        g2d.draw(shape); // !! added
    }
}
作为两个旁注:

  • A1类中有太多的静态代码,包括静态字段,大部分都应该是实例代码,主方法中的大部分代码应该被删除并放入构造函数中。主要方法应该非常小
  • 您需要将Canvas类重命名为不同的名称,因为这可能会与核心Java类Java.awt.Canvas产生名称冲突,并且如果将来将该类移动到另一个包中,可能会混淆其他类甚至编译器
  • 你可以合并你的任务