首页
学习
活动
专区
工具
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的操作。这样可以保持界面的响应性,避免程序挂起。

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

相关·内容

  • Swing的介绍

    Swing是一个为java设计的GUI工具包.Swing是JAVA基础类的一部分.Swing包括了图形用户界面(GUI)器件如 : 文本框,按钮,分隔窗格和表.Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT.它们是JFC一部分.它们支持可更换的面板和主题,然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们.这意味着你可以在任意平台上使用JAVA支持的任意面板.轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为.Swing开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100%的java实现,不再依赖于本地平台的,图形界面.,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色.由于AWT需要调用底层平台的GUI实现,所以AWT只能使用各种平台上GUI组件的交集,这大大限制了AWT所支持的GUI组件.对Swing而言,几乎所有组件都采用纯Java实现,所以无须考虑底层平台是否支持该组件,因此Swing可以提供如JTabbedPane,JDesktopPane,JInternalFarme等特殊的容器,也可以提供像JTree,JTable,JSpinner,JSlider等特殊的GUI组件.

    02
    领券