2016-09-12 9 views
1

Circle/Draw Lineボタンを押すたびに円を描画するGUIを書く必要があります。ボタンを押してシェイプを描くActionListenerを書く

フレームはうまく動作しますが、このプログラムのActionListenerの実装に問題があります。私はどのように "ブールサークル"とボタンを接続するのかわかりません。私が試したすべてが私にエラーを与える。

多分お手伝いできます。

public class fram extends JFrame { 
    fram(){ 
     JPanel panel = new JPanel(); 
     add(panel); 
     JButton btn1 = new JButton("Draw Circle"); 
     JButton btn2 = new JButton("Draw Lines"); 
     panel.add(btn1); 
     panel.add(btn2); 
     MyPanel obj = new MyPanel(); 
     panel.add(obj); 
} 

public class MyPanel extends JPanel{ 
    public boolean circZ = true; 

    public void paintComponent(Graphics g){** 
     super.paintComponent(g); 
     if(cicZ == true){ 
      g.setColor(Color.BLACK); 
      g.drawOval(150, 50, 50, 50); 
     }else if(circZ==false){ 
       ... 
      } 
    } 
} 

public class CRListener implements ActionListener(){ 

      !!! I DO NEED HELP HERE !!! 
} 

public static void main(String[]args){ 
    fram f = new fram(); 
    f.paint(null); 
} 
+1

'ActionListener'は' JFrame'に追加する必要があります。だから 'fram'クラスのイベント処理は' JFrame'を拡張し、 'public class fram extends JFrame extends ActionListener'と宣言しています。それは役に立ちますか? – progyammer

+1

また、 'fram'クラスのコンストラクタに' addActionListener(this); 'というステートメントが必要です。 – progyammer

答えて

2

匿名のActionListenersをボタンに追加することで、何をしようとしているのかを確認できます(下記参照)。 MyPanel final、または含まれているメンバーframを後で参照できるようにする必要があります。

注:この設計では、MyPanelframの内部クラスとcircZあなたがメソッドを実装する必要がfram

MyPanel obj; 
    fram(){ 
     JPanel panel = new JPanel(); 
     add(panel); 
     JButton btn1 = new JButton("Draw Circle"); 
     JButton btn2 = new JButton("Draw Lines"); 
     btn1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      obj.circZ =...; 
     } 
     }); 
     btn2.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      obj.circZ =...; 
     } 
     }); 
     panel.add(btn1); 
     panel.add(btn2); 
     obj = new MyPanel(); 
     panel.add(obj); 
    } 
0

それぞれのJButtonにactionListenerを追加するだけです。 bt1に1を加え、btn2に1を加えます。それぞれには、どれが押されたのかが分かります。なぜなら、そのアクションリストのactionListenerが起動するからです。それぞれで、円または線を生成するハンドル。私がやる方法は、パネルが描いている図形を保持するためのCopyOnWriteArrayListを作成することです。そうでなければConcurrentModificationを実行することができます。また、新しく生成された図形を保持するには、OptionalまたはAtomicRefenceを使用します。再ペイントでは、Optionals/AtomicReferenceのいずれかが新しい値を持つかどうかを調べる必要があります。存在する場合は、それを配列リストに追加し、それをアトミックな参照から削除します。その下に、配列リストをループし、それに含まれるすべてのグラフィックスオブジェクトを描画します。

+0

投稿されたコードのように、ActionListenersからMyPanelを参照する方法がありません – ControlAltDel

+0

私はスプーンフィードの回答を出していませんでした。私はそれをどのように扱うべきかの基礎を提供しました。 – Jacob

+0

Jacobあなたは少なくとも、「スプーンフィード」したくない場合でも、スコープの問題があることを述べておく必要があります。 – ControlAltDel

0

のメンバーを作るためにきれいになります:

class CRListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) {  
      System.out.println("Hello action listener"); // nothing happens  
     } 
} 

とボタンにアタッチします:

btn1.addActionListener(new CRListener()); 

すべてのボタンを繰り返し(とそれを動作させる)、あなたは、コンストラクタにパラメータを渡すことによって、それを最適化するために見ることができます - 私はあなたが:)

UPDATEDコメント

をに基づいて、その部分を把握せていただきますあなたが次のことを行うことができ、パネルの上にアクションリスナーを接続するには

public class fram extends JFrame { 

    MyPanel myPanel; 

    fram(){ 
     JPanel panel = new JPanel(); 
     add(panel); 
     JButton btn1 = new JButton("Draw Circle"); 
     JButton btn2 = new JButton("Draw Lines"); 

     // add event listeners 
     btn1.addActionListener(new CRListener()); 
     btn2.addActionListener(new CRListener()); 

     panel.add(btn1); 
     panel.add(btn2); 
     myPanel = new MyPanel(); 
     panel.add(myPanel); 
} 
+0

がダウン投票されました。投稿されたコードのように、MyPanelをActionListenersから参照する方法はありません – ControlAltDel

関連する問題