2015-12-31 34 views
0

我正在嘗試編寫一個簡單的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() - 像魔術一樣工作。

回答

3

您必須重寫PanelBlackpaintComponent(Graphics)方法。

getGraphics()是不可靠的做你的畫,paintComponent(Graphics)是你應該在哪裏定製繪畫。

Painting in Swing

+0

感謝你的快速回答,我的所有的東西GUI的知識是非常有限的。我應該在哪裏重寫代碼? 如果你願意,一個書面的例子可以幫助我很大程度上爲我找到的大多數教程(包括你鏈接的那個)都充滿了這麼多的信息,它很難找到我要找的東西。 –

+0

如果PanelBlack尚未擁有自己的類,請創建PanelBlack類,擴展JPanel,並將paintComponent方法放在此處。 – Berger

+0

明白了......生病請嘗試 –