我正在嘗試編寫一個簡單的GUI應用程序,允許用戶在這種情況下點擊面板BlackPanel
來繪製點。比將這些點保存到文件中。並能夠從文件加載點並顯示它們。從陣列到JPanel的着色點
我已經成功地保存並從文件加載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。
EDIT:溶液通過@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()
- 像魔術一樣工作。
感謝你的快速回答,我的所有的東西GUI的知識是非常有限的。我應該在哪裏重寫代碼? 如果你願意,一個書面的例子可以幫助我很大程度上爲我找到的大多數教程(包括你鏈接的那個)都充滿了這麼多的信息,它很難找到我要找的東西。 –
如果PanelBlack尚未擁有自己的類,請創建PanelBlack類,擴展JPanel,並將paintComponent方法放在此處。 – Berger
明白了......生病請嘗試 –