从数组到JPanel的绘制点

时间:2015-12-31 08:59:42

标签: java swing jpanel

我正在尝试编写一个简单的GUI应用程序,允许用户在这种情况下单击面板BlackPanel来绘制点。而不是将这些点保存到文件中。并且能够从文件加载点并显示它们。

我已成功完成了从文件中保存和加载ArrayList<Point>所需的所有函数和方法,并确保加载的点包含重新绘制所需的坐标

我的问题是我无法创建一个绘制数组中所有点的方法

我的主要课程是JFrame,其中添加了两个JPanel

  • MainPanel,其中包含一些内容
  • 用于绘画的
  • BlackPanel

我的班级有一个ArrayList - 积分作为班级成员。

所有Point对象都是使用java.awt.Point生成的。

    private void paintPoint(Graphics g, Point p) {
        g.setColor(Color.white);
        g.fillOval(p.x, p.y, 5, 5);
    } // this one is used to create a single dot called by MouseClicked event - works

    private void paintPoints(Graphics g, ArrayList<Point> points) {
        g.setColor(Color.white);
        for (Point point : points) {
            g.fillOval(point.x, point.y, 5, 5);
        }
    } // this one is called by LoadPointsDialog() which in turn is called by a button action

    private void loadPointsDialog() {
        FileDialog fd = new FileDialog(this, "Open XML file", FileDialog.LOAD);
        fd.setDirectory("C:\\");
        fd.setFile("*.xml");
        fd.setFilenameFilter((File dir, String name) -> name.endsWith(".xml"));
        fd.setVisible(true);
        String folder = fd.getDirectory();
        String fileName = fd.getFile();
        ArrayList<Point> aux;
        try { // irrelevent for this question. works.
            aux = XMLio.read(folder+fileName); 
        } catch (IOException e) {
            System.err.println("Error! Failed reading from file");
            return;
        } 
        ItemClear.doClick(); // clears points class member and calls BlackPanel.updateUI();
        points.addAll(aux); // works 100% i checked to see if the points exist.
        paintPoints(PanelBlack.getGraphics(), points);
    }

private void ItemOpenActionPerformed(java.awt.event.ActionEvent evt) {                                         
    loadPointsDialog();
}   

private void PanelBlackMouseClicked(java.awt.event.MouseEvent evt) {                                        
    Point p = evt.getPoint();
    paintPoint(PanelBlack.getGraphics(), p);
    savePoint(p); // points.add(p);
}                                       

private void ItemClearActionPerformed(java.awt.event.ActionEvent evt) {                                          
    PanelBlack.updateUI();
    points.clear();
}  

我正在使用NetBeans设计器工具来创建此JFrame。

编辑:@Berger的解决方案

我创建了一个新的嵌套类:

public class PaintPanel extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
            for (Point point : points) {
                g.fillOval(point.x, point.y, 5, 5);
            }
        }
    }

并将PanelBlack定义为此类的对象。

然后我在加载新的点数组后调用了repaint() - 就像魔法一样。

1 个答案:

答案 0 :(得分:3)

您必须覆盖paintComponent(Graphics)的{​​{1}}方法。

PanelBlack绘画不可靠,getGraphics()是您应该自定义绘画的地方。

Painting in Swing