2017-05-29 12 views
0

私はペイントプログラムを作成しています。マウスの入力とペイントを検出するメインのPaintクラスと、左側のツールバーであるToolsクラスを持っています。ブラシサイズの変更と形状の変更。したがって、画面全体をクリアするToolsクラスにクリアボタンを追加したいと思います。私の問題は、Paintクラスが描画する点のArrayListを保持しているため、PaintToolsから再描画できないことです。私がいるJPanelを別の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()はインスタンスメソッドですので、私はsがTools内から再描画Paint」にアクセスできないことです。

+0

そうでは、あなたの「ツール」は「ペイント」に話をいくつかの方法を持っていることを前提とし選択されたものに基づいて、なぜあなたは同じパラダイムに従うことができないのですか? – MadProgrammer

+0

ああ、ペイントでは絵がすべて起こっている。 – L1ghtShadow

+1

ええ、しかし、「ペイント」は、ツールバーで選択されたものに基づいて、どのようにペイントするかを知っていますか?おそらくあなたはどのように 'ペイント'を設定する必要がありますか? – 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

@LlghtShadow:JFrameで 'repaint()'を呼び出すと、再帰的にすべての子コンポーネントも再描画する必要があります。 –

関連する問題