首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在JButton listener中更换两个JPanels时程序挂起

是因为在事件处理线程(Event Dispatch Thread)中进行了耗时的操作,导致界面无响应。为了解决这个问题,可以使用多线程来执行耗时操作,以保持界面的流畅性。

具体的解决方案如下:

  1. 创建一个新的线程来执行耗时操作,例如使用SwingWorker类。SwingWorker是Swing提供的一个工具类,可以在后台执行耗时操作,并在完成后更新界面。
  2. 在JButton的listener中,创建一个新的SwingWorker对象,并重写其doInBackground()方法来执行耗时操作。在doInBackground()方法中,可以执行需要更换JPanels的操作。
  3. doInBackground()方法中,如果需要更新界面,可以使用publish()方法来发布中间结果,然后在process()方法中更新界面。这样可以避免直接在doInBackground()方法中更新界面,从而保持界面的响应性。
  4. done()方法中,可以进行一些清理操作或者处理耗时操作的结果。

下面是一个示例代码:

代码语言:txt
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame {
    private JPanel panel1;
    private JPanel panel2;

    public MyFrame() {
        panel1 = new JPanel();
        panel2 = new JPanel();

        JButton button = new JButton("Switch Panels");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 创建一个SwingWorker对象
                SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                    @Override
                    protected Void doInBackground() throws Exception {
                        // 执行耗时操作,例如更换JPanels
                        switchPanels();
                        return null;
                    }

                    @Override
                    protected void done() {
                        // 可以进行一些清理操作或者处理耗时操作的结果
                    }
                };

                // 执行SwingWorker
                worker.execute();
            }
        });

        setLayout(new BorderLayout());
        add(button, BorderLayout.NORTH);
        add(panel1, BorderLayout.CENTER);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    private void switchPanels() {
        // 执行更换JPanels的操作
        // 例如:
        remove(panel1);
        add(panel2, BorderLayout.CENTER);
        revalidate();
        repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyFrame();
            }
        });
    }
}

在这个示例中,当点击按钮时,会创建一个新的SwingWorker对象,并在其doInBackground()方法中执行更换JPanels的操作。这样可以保持界面的响应性,避免程序挂起。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券