2009-12-24 64 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。如果您在问题中提供更多详细信息,我相信这里有人会为您提供更详细的答案。