【问题标题】:Storing shapes in JComponent在 JComponent 中存储形状
【发布时间】:2016-06-10 21:49:42
【问题描述】:

我不确定如何使用一个形状类型的数组列表来存储多个不同的形状。这是主要的。

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();
    }
}
}

【问题讨论】:

  • "...and what to put in the paintComponent to store the shapes." -- 这不应该是 paintComponent 方法的一部分。此方法仅用于在组件上绘制项目,仅此而已。它不应该用于程序逻辑。存储形状的代码应该在您的鼠标侦听器类型代码中,而不是在paintComponent中。
  • 在paintComponent方法的for循环中,你应该有g2d.draw(shape);
  • 所有的paintComponent方法中for循环后的代码都应该去掉。
  • 请查看更新以回答。
  • 请不要通过删除代码来破坏您的问题。请理解,您的问题和这里的答案不是针对您本身,而是为了将来可能遇到类似问题的访问者的利益。如果你破坏你的问题,那么所有的好处都将失去。

标签: java swing arraylist


【解决方案1】:

您的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 类中有太多静态代码,包括静态字段,而且大部分都应该是实例代码,并且应该删除 main 方法中的大部分代码并将其放入构造函数中。 main 方法应该很小。
  • 您需要将 Canvas 类重命名为不同的名称,因为这会与核心 Java 类 java.awt.Canvas 产生潜在的名称冲突,并且如果您将该类移至未来。
  • 您可以将 MouseListener 和 MouseMotionListener 代码组合成一个扩展 MouseAdapter 的类。这将简化您的代码,并允许您避免发布空方法停止。
  • 由于您的绘图选择是互斥的,我会使用 JRadioButtons 或 JToggleButtons 都保存在单个 ButtonGroup 中,以便用户可以轻松查看当前处于活动状态的选择,并且选择一个按钮会关闭所有按钮的选择其他人。

【讨论】:

  • 感谢您的帮助,现在可以正常存储了;但是,我不再获得平滑的绘图(在拖动鼠标时,我看不到形状的轮廓),因为现在我只是拖动并随机出现一个形状。我听从了你的建议并修正了命名。关于主类,我不确定你说的静态代码太多是什么意思。
  • @JClutch:好的,那我错了,也许你确实需要paintComponent中for循环之后的代码。再静态,主方法应该很小,可能只有几行,它的工作应该是创建你的主类(new Something())并让它运行。您当前在 main 方法中的大部分代码是构建 GUI 的代码,不应该在其中。
  • @JClutch:并且您的存储始终运行良好——您只是从未使用 Graphics2D 对象来绘制存储的内容。一个简单的修复。 1+ 对您的问题 - 我不确定为什么它被否决了。
  • 我在循环之后添加了我之前的内容,它工作正常,但我现在得到一个 NullPointerException,我可以忽略它,因为一切正常吗?关于主线,我想我明白你在说什么。感谢您的帮助。
  • @JClutch:不,永远不要忽略 NPE。 NullPointerExceptions 的启发式几乎总是相同的。 您应该认真阅读异常的堆栈跟踪,找出出错的代码行、引发异常的行,然后仔细检查该行,找出哪个变量为空,然后回溯到您的代码看看为什么。你会一次又一次地遇到这些,相信我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2023-03-22
  • 2012-02-06
相关资源
最近更新 更多