我正在尝试编写一个简单的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()
- 就像魔法一样。
答案 0 :(得分:3)
您必须覆盖paintComponent(Graphics)
的{{1}}方法。
PanelBlack
绘画不可靠,getGraphics()
是您应该自定义绘画的地方。