代码运行多次

时间:2012-01-31 19:22:39

标签: java swing jframe

这是我正在执行的代码多次运行的示例代码。

头等舱:

public class Test2 extends JFrame {
public static int asd = 0;

private JPanel contentPane;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Test2 frame = new Test2();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


public Test2() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JButton btnShowtest = new JButton("ShowTest2");
    btnShowtest.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Test1 a1 = new Test1();
            a1.setVisible(true);
            dispose();
        }
    });
    contentPane.add(btnShowtest, BorderLayout.CENTER);
}
}

按下按钮时,会打开:

public class Test1 extends JFrame {
public static int ab = 1;

private JPanel contentPane;


public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Test1 frame = new Test1();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


public Test1() {
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JButton btnrun = new JButton("runt");
    btnrun.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Test3.error();
        }
    });
    contentPane.add(btnrun, BorderLayout.CENTER);
}
}

按下按钮时,执行以下代码:

public class Test3 {
public static void error(){
    JOptionPane.showMessageDialog(null, "error");
    Test2.asd += 1;
    System.err.print(Test2.asd);
    final Frame[] frames = Frame.getFrames();
    for (Frame f : frames){ 
        f.dispose();
        Test2 newtet = new Test2();
        newtet.setVisible(true);
    }
}
}

现在每次再次按下按钮,它都会执行Test3.error();多次。 例如,如果我按下按钮10次,然后Test3.error();跑了10次。

我猜这是一个简单的修复,但我无法弄明白。

编辑:

当我按下btnrun按钮时,它会运行“Test3.error()”代码,然后关闭所有帧并创建另一个主框架。

当我回到btnrun并再次按下它时,它会运行“Test3.error()”2次而不是一次。 2 JOptionePanes并创建两次新主机。

如果我再次这样做,它会运行“Test3.error()”3次,依此类推。

我想要的是它总是只运行一次“Test3.error()”但由于某种原因它不会。

另一个例子:

public class Frame1 extends JFrame {

private JPanel contentPane;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Frame1 frame = new Frame1();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


public Frame1() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JButton btnRun = new JButton("Run");
    btnRun.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Run.run();
        }
    });
    contentPane.add(btnRun, BorderLayout.CENTER);
}

}

运行的代码:

public class Run {
public static void run(){
    final Frame[] frames = Frame.getFrames();
    for (Frame f : frames){ 
        f.dispose();
        Frame1 newtet = new Frame1();
        newtet.setVisible(true);
}

} }

同样的问题。

每当我按下运行按钮时,它会执行代码,就像我过去按下它一样多次。

按下按钮一旦它丢弃Frame1并重新创建Frame1。 再按一次,它会连续执行2次代码。 (处置Frame1,创建Frame1,dipose Frame1并创建Frame1)

1 个答案:

答案 0 :(得分:2)

是的,你在这里添加了一个动作监听器:

JButton btnrun = new JButton("runt");
btnrun.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Test3.error();
    }
});

表示“点击按钮时,请拨打Test3.error()。”您是否希望在执行一次后自动删除动作侦听器?

编辑:好的,我想我已经知道发生了什么。这就是问题所在:

final Frame[] frames = Frame.getFrames();
for (Frame f : frames){ 
    f.dispose();
    Test2 newtet = new Test2();
    newtet.setVisible(true);
}

对于每个现有框架,您将处置该框架并创建新的Test2()。因此,当您单击按钮时,屏幕上有3个帧(Test1,Test2和Test3),最终会有三个新的Test2帧。我怀疑你不是故意这样做的。你的意思是这个吗?

for (Frame f : Frame.getFrames()){ 
    f.dispose();
}
Test2 newtet = new Test2();
newtet.setVisible(true);