2012-10-15 58 views
1

對於我編寫的某些代碼嘗試某些內容有點小問題。我用一個按鈕製作了一個框架。當我點擊這個按鈕,一個新的框架打開,它應該。我關閉新框架,然後再次單擊該按鈕,嘗試查看它是否仍然有效。這個問題從這裏開始,科西嘉試圖打開一個新的框架,它打開兩個新的框架。第三次,我點擊它打開4幀等。我嘗試了很多東西,但是很遺憾,似乎找不到它打開更多框架的原因。請幫忙。在每次點擊時打開雙倍數量的新幀

package budget; 

import java.awt.event.*; 
import javax.swing.*; 

public class GUI extends JFrame { 

    String labelPrefix; 
    JButton button; 
    JButton button2; 
    JLabel label; 

    public static void main(String[] args) { 
     JFrame f = new GUI(); 
     f.setExtendedState(f.MAXIMIZED_BOTH); 
     f.setVisible(true); 
    } 

    public GUI() { 
     JPanel p = new JPanel(); 
     p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); 
     p.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 

     button = new JButton("Click Me"); 
     label = new JLabel(labelPrefix); 
     p.add(button); 
     this.setTitle("Try"); 
     getContentPane().add(p); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     button.addActionListener(new MyActionListener()); 
    } 

    class MyActionListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      button.addActionListener(this); 
      labelPrefix = "Try"; 
      JFrame f2 = new GUI(label, labelPrefix); 
      f2.setExtendedState(f2.MAXIMIZED_BOTH); 
      f2.setVisible(true); 

     } 
    } 

    public GUI(JLabel label, String labelPrefix) { 
     JPanel p2 = new JPanel(); 
     button2 = new JButton("Close"); 
     p2.add(label); 
     p2.add(button2); 
     this.setTitle("Try"); 
     getContentPane().add(p2); 
     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     pack(); 
     button2.addActionListener(new MyActionListener2()); 
    } 

    class MyActionListener2 implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      button2.addActionListener(this); 
      dispose(); 
     } 
    } 
} 
+1

*「一個新的框架打開,它應該」*要求不同。請參閱[使用多個JFrames,良好/錯誤的實踐?](http://stackoverflow.com/a/9554657/418556) –

回答

3

顯然,問題就在這裏:

button.addActionListener(this); 

每次單擊該按鈕,它增加了聽者另一個時間的按鈕。

只需刪除該行,錯誤就會消失。一旦偵聽器被添加到按鈕,它就會停留在那裏。觸發後不會「消耗」。

+0

+1純回答。 – Juvanis

+0

非常感謝,清除了我的問題 – user1746780

0

入住的MyActionListeneractionPerformed其中規定的第一行:

button.addActionListener(this); 

此行應該被刪除。