2017-05-29 97 views
0

重畫一個JPanel因此,我正在製作一個繪畫程序,並且我有一個主要的Paint類,它檢測鼠標輸入和顏色,以及一個類似左邊的工具欄,它包含一組工具,如畫筆尺寸變化和形狀變化。所以,我想在清除整個屏幕的類上添加一個清除按鈕到Tools。我的問題是Paint類正在持有它繪製的點的ArrayList,我不能從Tools內重新繪製Paint從另一個JPanel

Paint

//imports  
public class Paint extends JPanel{ 
    private ArrayList<Brush> points; 
    ... 

    public Paint() { 
     ... 
    } 

    public void paintComponent(Graphics page) { 
     ... 

     //draws all points in the arraylist 
     for (Brush b : points) { 
      //paint points 
     } 
    } 
} 

Tools

//imports 
public class Tools extends JPanel 
{ 
    private JButton clear; 

    public Tools() { 
     clear = new JButton("Clear"); 
     clear.addActionListener(new BrushInput()); 
    } 

    public void paintComponent(Graphics page) { 
     ... 
    } 
    private class BrushInput implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == clear) { 
       //clear points arraylist and repaint 
      } 
     } 
    } 

} 

我遇到的問題是,repaint()是實例方法,所以我不能訪問Paint的從Tools內重繪。

+0

所以,假設你的「工具」有那麼它知道應該如何談「畫」的一些方法基於選擇的內容,你爲什麼不能遵循相同的範式? – MadProgrammer

+0

哦,這幅畫全部都在Paint中發生。 – L1ghtShadow

+1

是的,但是基於工具欄上選擇的內容,「Paint」如何知道「如何」繪製?據推測,你必須配置'Paint'一些如何? – MadProgrammer

回答

1

只需將對Paint實例的引用傳遞給Tools的構造函數即可。或者,對包含兩者的容器(JFrame等)進行重新粉刷,這會導致其所有子項都被重新粉刷。

例如:創建這些組件

public class Paint extends JPanel { 
    private ArrayList<Brush> points; 

    // . . . 

    public void clear() { 
     points.clear(); 
     repaint(); 
    } 
} 

public class Tools extends JPanel { 
    private JButton clear; 
    private Paint paint; 

    public Tools(Paint paint) { 
     this.paint = paint; 
     // . . . 
    } 

    // . . . 

    private class BrushInput implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == clear) { 
       paint.clear(); 
      } 
     } 
    } 
} 

代碼:

Paint paint = new Paint(); 
Tools tools = new Tools(paint); 
+0

雖然不是重新繪製一個實例方法,但是我有一個可以同時擁有但是如何稱之爲重繪的JFrame? – L1ghtShadow

+0

@ L1ghtShadow通過在構造它時將一個引用傳遞給'Tools'。 –

+0

@ L1ghtShadow:如果您在JFrame上調用repaint(),它也應該遞歸地重繪它的所有子組件。 –

相關問題