来自单独线程的GUI

时间:2016-03-18 10:16:16

标签: java multithreading swing

尝试创建两个独立的格式,可以在不同的线程中运行代码。下面的代码创建了两种形式,但是如果我按下其中一种形式的按钮,我就不能对另一种形式做同样的事情。它根本不执行代码。如何制作两个可以互相阻塞的简单形式?

public class MnemonicEx1 extends JFrame
{

    public JeasiHandler jh = null;
    private Log log = Log.getLog();

    public MnemonicEx1()
    {

        initUI();
    }

    private void initUI()
    {

        JButton btnAuth = new JButton("1");

        btnAuth.addActionListener(new ActionListener()
        {

            // @Override
            public void actionPerformed(ActionEvent e)
            {

                System.out.println("starting");
                for (int i = 0; i < 1000; i++)
                {
                    try
                    {
                        Thread.sleep(100);
                        System.out.println(Integer.toString(i));
                    } catch (InterruptedException ex)
                    {
                        ex.printStackTrace();
                    }
                }

                System.out.println("finishing");

            }


        });

        btnAuth.setMnemonic(KeyEvent.VK_B);

        //createLayout(btnAuth);
        createLayout(btnAuth);

        setTitle("****");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent authButn)
    {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        int i = 0;
        gl.setHorizontalGroup(
                gl.createSequentialGroup()
                .addComponent(authButn)
        );

        gl.setVerticalGroup(gl.createParallelGroup()
                .addComponent(authButn)
        );

        pack();
    }

    public static void main(String[] args)
    {

        EventQueue.invokeLater(new Runnable()
        {

            public void run()
            {
                MnemonicEx1 ex = new MnemonicEx1();
                ex.setVisible(true);
            }
        });

        EventQueue.invokeLater(new Runnable()
        {

            public void run()
            {
                MnemonicEx1 ex = new MnemonicEx1();
                ex.setVisible(true);
            }
        });

    }
}

UPD

通过创建单独的线程来更改main(),但得到了相同的结果

public static void main(String[] args)
    {

        new Thread (new Runnable()
        {

            public void run()
            {
                MnemonicEx1 ex = new MnemonicEx1();
                ex.setVisible(true);
            }
        }).start();

        new Thread(new Runnable()
        {

            public void run()
            {
                MnemonicEx1 ex = new MnemonicEx1();
                ex.setVisible(true);
            }
        }).start();

    }

1 个答案:

答案 0 :(得分:3)

@Nadir或多或少是正确的。

您在由EventQueue表示的同一个线程中启动两个窗口。

我认为swing程序员更喜欢使用SwingUtilities打开新的框架应用程序,但是你可以实现改变你的方法action的目标。

        // @Override
        public void actionPerformed(ActionEvent e) {

            new Thread() {
                @Override
                public void run() {
                    System.out.println("starting");
                    for (int i = 0; i < 1000; i++)
                    {
                        try
                        {
                            Thread.sleep(100);
                            System.out.println(Integer.toString(i));
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                     System.out.println("finishing");
                }
            }.start();

这样你就会有两个不同的主题。在原始版本中,您只有一个帖子。

更新:更改您的主要方法

     public static void main(String[] args)
     {

        SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            MnemonicEx1 ex = new MnemonicEx1();
            ex.setVisible(true);
        }
        });

        SwingUtilities.invokeLater(new Runnable() {

        public void run()
        {
            MnemonicEx1 ex = new MnemonicEx1();
            ex.setVisible(true);
        }
    });

}