JOptionPane调用堆栈

时间:2009-12-24 15:58:07

标签: java swing

我在JOptionPane上遇到了一个小问题,我用它来警告用户是否找到了错误的输入。它第一次工作正确。但是当我关闭调用JOptionPane的JFrame并再次打开它时,这次会调用它两次。它会堆叠在我关闭的每一次。

我试图在没有运气的情况下寻找问题。我可以提供代码,但它非常大。

第三次编辑:我现在找到并解决了这个问题。

好的,我提供了我使用的代码。我把它剪下来所以只显示必要的一个。我不认为它会编译,但这是我使用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);
        }

2 个答案:

答案 0 :(得分:1)

每次打开JFrame时都会添加“验证侦听器”。因此,请检查“addListenerXXX”代码,确保仅添加/创建一次。

这也导致了为什么你为此使用JFrame的问题?通常,应用程序具有单个JFrame。然后,如果您需要一个窗口来输入数据,则需要创建一个JDialog。

答案 1 :(得分:0)

通过传递null作为该方法的第一个参数,您将创建一个默认的JFrame,JOptionPane将其用作其父组件,而不是您在代码中创建的JFrame。如果您在问题中提供更多详细信息,我相信此处有人会为您提供更详细的答案。