从数组到 JPanel 的 Paint Points
Paint Points from array to JPanel
我正在尝试编写一个简单的 GUI 应用程序,允许用户在面板上单击,BlackPanel
在这种情况下,绘制一个点。而不是将这些点保存到文件中。以及从文件加载点并显示它们的能力。
我已经成功制作了从文件中保存和加载 ArrayList<Point>
所需的所有函数和方法,并确保加载的点包含需要重新绘制的坐标
我的问题是我无法创建一个方法来绘制数组中的所有点
我的主要 class 是一个 JFrame
,其中添加了两个 JPanel
:
MainPanel
里面有一些东西
BlackPanel
用来作画。
我的 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()
- 就像变魔术一样。
您必须覆盖 PanelBlack
的 paintComponent(Graphics)
方法。
getGraphics()
做你的画不靠谱,paintComponent(Graphics)
是你要自定义画的地方
我正在尝试编写一个简单的 GUI 应用程序,允许用户在面板上单击,BlackPanel
在这种情况下,绘制一个点。而不是将这些点保存到文件中。以及从文件加载点并显示它们的能力。
我已经成功制作了从文件中保存和加载 ArrayList<Point>
所需的所有函数和方法,并确保加载的点包含需要重新绘制的坐标
我的问题是我无法创建一个方法来绘制数组中的所有点
我的主要 class 是一个 JFrame
,其中添加了两个 JPanel
:
MainPanel
里面有一些东西BlackPanel
用来作画。
我的 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()
- 就像变魔术一样。
您必须覆盖 PanelBlack
的 paintComponent(Graphics)
方法。
getGraphics()
做你的画不靠谱,paintComponent(Graphics)
是你要自定义画的地方