2009-12-24 57 views
0

我遇到了一個JOptionPane問題,我用它來警告用戶輸入錯誤。它第一次正確工作。但是當我關閉調用該JOptionPane的JFrame並再次打開它時,這次會調用它兩次。它會爲我每次關閉時都堆疊起來。JOptionPane調用棧

我試圖找到沒有任何運氣的問題。我可以提供代碼,但它相當大。

第三次編輯:我發現並解決了現在的問題。

好吧,我提供了我使用的代碼。我已經把它剪掉了,所以它只顯示必要的一個。我不認爲它會編譯,但這是我如何使用addActionListener();

public class BorderLayoutDemo extends JFrame implements ActionListener { 

    private JButton button1 = new JButton("L?gg till kund"); 
    private JButton button2 = new JButton("Ta bort kund"); 
    private JButton button3 = new JButton("Visa kund"); 
    private JButton button4 = new JButton("Lista alla kunder"); 
    private JButton button5 = new JButton("Avsluta"); 
    private JButton button6 = new JButton("Change"); 

    private JTextArea TextWindow = new JTextArea("Hej\nHej\nHej\nHej\nHej\nHej\nHej\nHej\nHej\nHej\nHej\nHej\nHej\n"); 
    private JScrollPane scrollPane = new JScrollPane(TextWindow); //l?gger in TextWindow s? att det f?r en scroll-bar 

    private JPanel aPanel = new JPanel(); 
    private JFrame aFrame = new JFrame(); 

    private JTextField aTextfield1 = new JTextField(); 
    private JTextField aTextfield2 = new JTextField(); 

    private JButton aButton1 = new JButton("L?gg till kund"); 
    private JButton aButton2 = new JButton("St?ng"); 

    public BorderLayoutDemo() { 

      setTitle("Bankregister"); 

      setLayout(new BorderLayout()); 

      JPanel panel = new JPanel(); 
      panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); 
      panel.setLayout(new GridLayout(6,1,55,5)); //row, cols, hgap, vgap 

      button1.addActionListener(this); 
      button2.addActionListener(this); 
      button3.addActionListener(this); 
      button4.addActionListener(this); 
      button5.addActionListener(this); 
      button6.addActionListener(this); 

      panel.add(button1); 
      panel.add(button2); 
      panel.add(button3); 
      panel.add(button4); 
      panel.add(button5); 
      panel.add(button6); 

      JPanel panel2 = new JPanel(); 
      panel2.add(panel); 

      add(panel2,BorderLayout.WEST); 
      add(scrollPane,BorderLayout.CENTER); 

      setJMenuBar(menu()); 

      setSize(600,300); 

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setLocationRelativeTo(null); 
      setVisible(true); 

    } 

    public void addCustomer(boolean status) { 


      if(status) {  

       aFrame.setTitle("L?gg till kund"); 
       aFrame.setSize(200,300); 
       aFrame.setLayout(new GridLayout(3,1)); 

       aPanel.setLayout(new GridLayout(2,1)); //rad, kolumn 

       aPanel.add(aTextfield1); 
       aPanel.add(aTextfield2); 

       aButton1.addActionListener(this); 
       aButton2.addActionListener(this); 
       System.out.println("Foo!!!!!!!!!!!!!"); 

       aFrame.add(aPanel); 
       aFrame.add(aButton1); 
       aFrame.add(aButton2); 

       aFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       aFrame.setLocationRelativeTo(null); 
       aFrame.setVisible(true); 
      } 
      else { 

       aFrame.setVisible(false); 


      } 
    } 

    public static void main(String[] args) { 

     new BorderLayoutDemo(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == button1) { 
      setEnabled(false); 
      addCustomer(true); 
     } 

     //IFs f?r addCustomer(); 
     else if(e.getSource() == aButton1) { 

      if((aTextfield1.getText().isEmpty() || aTextfield2.getText().isEmpty())) { 
       JOptionPane.showMessageDialog(null, "You miss to fill out the fields"); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "Added"); 
       Kund kund = new Kund(aTextfield1.getText(),aTextfield2.getText()); 
       setEnabled(true); 
       register.add(kund); 
      } 
     } 
     else if(e.getSource() == aButton2) { 
      setEnabled(true); 
      addCustomer(false); 
     } 
+1

嘗試只發布創建的代碼和打開JOptionPane的代碼。 – TofuBeer 2009-12-24 16:11:14

+0

該代碼不能幫助我們。在代碼中查找使用「addActionListener()」的地方並添加一個System.out.println(...),正如我在下面建議的那樣,我相信你會發現輸出不止一次顯示。 – camickr 2009-12-24 16:53:26

回答

1

聽起來就像您每次打開JFrame時添加「驗證偵聽器」。因此,請檢查您的「addListenerXXX」代碼以確保只添加/創建一次。

這也會導致您爲什麼要爲此使用JFrame?通常,應用程序具有單個JFrame。然後,如果你需要一個窗口輸入數據,你可以創建一個JDialog。

+0

啊,我現在發現了錯誤。如你所說,它被調用並創建好幾次。 ^^ – starcorn 2009-12-24 17:32:59

0

通過傳遞null作爲該方法的第一個參數,您將創建一個默認JFrame,JOptionPane將其用作其父組件,而不是您在代碼中創建的JFrame。如果您在問題中提供更多詳細信息,我相信這裏有人會爲您提供更詳細的答案。