从数组到 JPanel 的 Paint Points

Paint Points from array to JPanel

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

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

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

我的主要 class 是一个 JFrame,其中添加了两个 JPanel

我的 Class 有一个 ArrayList - 积分为 class 会员。

所有点对象都是使用 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 的解决方案

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

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 定义为此 class 的对象。

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

您必须覆盖 PanelBlackpaintComponent(Graphics) 方法。

getGraphics()做你的画不靠谱,paintComponent(Graphics)是你要自定义画的地方

Painting in Swing