2016-09-12 58 views
1

我需要編寫一個GUI,每次按下Draw Circle/Draw Line按鈕時都會繪製圓/線。編寫ActionListener通過按下按鈕來繪製形狀

該框架工作得很好,但我無法實現此程序的ActionListener。我不知道如何用「boolean circZ」連接按鈕。我試過的每一件東西都給我錯誤

也許你可以幫忙。

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 implements ActionListener'。這有幫助嗎? – progyammer

+1

另外,在'fram'類構造函數中需要'addActionListener(this)'語句。 – progyammer

回答

2

通過將匿名ActionListeners添加到按鈕中,您可以完成要執行的操作(請參見下文)。您需要創建您的MyPanel final或包含fram中的成員,以便稍後可以引用它。

注:在本設計中,這將是更清潔,使MyPanel一個內部類的framcircZfram

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,另一個添加到btn2。在每一箇中,你都會知道哪一個被按下,因爲那個actionListener會觸發。在每一箇中,處理生成一個圓或一行。我會這樣做的方法是創建一個CopyOnWriteArrayList來保存面板正在繪製的幾何圖形 - 否則可以運行到ConcurrentModification。另外,使用Optional或AtomicRefence來保存新生成的形狀。在重新繪製時,您需要查看是否有Optionals/AtomicReferences具有新值。如果有,請將其添加到數組列表中,然後從原子引用中刪除它。在此之下,遍歷數組列表並繪製其包含的所有圖形對象。

+0

向下投票,因爲在發佈的代碼中沒有辦法從ActionListeners引用MyPanel – ControlAltDel

+0

我沒有給出答案。我提供了應該如何處理的基礎。 – Jacob

+0

雅各布,你應該至少提到有一個範圍界定問題,即使你不想「餵食」 – ControlAltDel

0

您需要實現該方法的成員:

class CRListener implements ActionListener { 

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

和然後將其附加到按鈕上:

btn1.addActionListener(new CRListener()); 

爲每個按鈕重複(並使其工作),那麼你可以看看通過傳遞參數給構造優化它 - 我會讓你找出那部分基於評論

:)

修訂

要連接上面面板中的動作偵聽器,你可以做到以下幾點:

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

向下投票,因爲在發佈的代碼中沒有辦法從ActionListeners引用MyPanel – ControlAltDel