2016-12-02 3 views
0

OK、これをできるだけ良く説明しようとしています。私はかなりJavaに堪能ですが、広範な検索の後にこれに論理的な解決策を見つけることができません。パッケージAの中に描かれるグラフを含むJPanelクラスがあるとします。私はJCheckBoxのを持っているパッケージB内の別のクラスにおいて別のパッケージのJCheckBox ActionListenerからJPanelを再ペイントする

package A 

public class DrawGraph extends JPanel 
{ 
    public DrawGraph() 
    { 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // other stuff 
    } 

    public void updateGraph() 
    { 
     repaint(); 
    } 
} 

選択すると、このクラスはDrawGraphクラスを初期化しないパッケージAのグラフの再描画をトリガする必要があること。そのクラスは他の場所で初期化されます。今、私はDrawGraphクラスの新しいインスタンスを作成することなく、私のDrawGraphクラスのupdateGraph関数を呼ぶのですか

package B 

public class CheckBoxClass extends JPanel 

public CheckBoxClass 
{ 
    graphicsCheckBox.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent cb) 
     { 
      GUI_Data.graphics = true; 
      DrawGraph.updateGraph(); // Calls Update Graph function 
     } 
    }); 
} 

?私はrepaint()が静的ではないので、updateGraphメソッドを静的にすることはできないことを知っています。私はタイマーや他の複雑なやり方で非効率的な方法で再描画せずにこれを行う方法が必要であるように感じる。私は間違った方法でこの問題を見ていますか?基本的には、JCheckBoxクラスのactionlistenerからDrawGraphクラスの描画をトリガーする方法が必要です。この質問が明確でない場合は、私にお知らせください。私はそれを改訂することができます。事前に皆さんありがとう、これは私の最初の質問ですが、私はあなたに数年間使っています。

答えて

0

ここでは概念の混乱のビットがあるようですが、私は説明しようとしましょう。

staticメソッドとインスタンスメソッド: クラスには静的メソッドと非静的メソッドがあります。非静的メソッドは、クラスのインスタンスに対してのみ呼び出すことができます。 staticはクラスに対してのみ呼び出すことができます(ただし、クラスのインスタンスを含む変数を通して呼び出すことはできます)。

メソッドの可視性:メソッドはプライベート、保護、パッケージ保護、またはパブリックにすることができます。プライベートメソッドは同じクラス内からのみ呼び出すことができます)。 protectedは、クラスまたはサブクラス内からのみ呼び出すことができます。同じパッケージ内のクラスからpackage-protected(修飾子なし)を呼び出すことができます。どこからでも公衆を呼び出すことができます。

CheckBoxClassが同じパッケージに含まれていないという事実は、DrawGraph.updateGraph()に電話をかけることができないという事実とは関係ありません。 updateGraph()はインスタンスメソッド(非静的)なので、呼び出すインスタンスが必要です。あなたのプログラムにDrawGraphのインスタンスが1つしかないことが分かっている場合、シングルトンパターン を使うことができます。DrawGraphクラスの静的変数は、クラス自体のインスタンスに初期化されています。また、このようなインスタンスを返す静的メソッドがあります。今、あなたはCheckBoxClassから次の操作を行うことができます

public class DrawGraph { 
    private static DrawGraph singleton = new DrawGraph(); 

    public static getInstance() { 
    return singleton; 
    } 
} 

を:

@Override 
    public void actionPerformed(ActionEvent cb) 
    { 
     GUI_Data.graphics = true; 
     DrawGraph.getInstance().updateGraph(); // Calls Update Graph function 
    } 
+0

は、私も、シングルトンを使用して考えていなかったように愚かな、本当にありがとうございましたパターン。私は私の実装のためにあなたの答えを少し変えなければならなかったが、それと同じ原則。再度、感謝します。 –

関連する問題