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

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

相关·内容

  • Java图形用户界面设计的布局管理器

    如果要让我么的程序不同的操作系统下,都有相同的使用体验,那么手动设置组件的位置和大小,无疑是一种灾难,因为有太多的组件,需要分别设置不同操作系统下的大小和位置。...简介 布局是指 GUI 程序容器各个组件的排列顺序、彼此之间的位置关系、组件大小,以及当容器移动或调整大小后组件的变化。...注意点 使用BorderLayout 有如下两个注意点: 当向使用 BorderLayout 布局管理器的容器添加组件 , 需要指定要添加到哪个区域中 。...当向使用 GridLayout 布局管理器的容器添加组件, 默认从左向右、 从上向下依次添加到每个网格 。...(listener); b5.addActionListener(listener); //7.把5个按钮添加到p2 p2.add(b1);

    14310

    Swing常用组件

    该类创建文本框,与AWT 的 TextField 一样,可以设置文本框内的初始文本内容、文本框的长度等。...addActionListener(ActionListener listener):为文本框添加动作监听器,当用户敲击回车键触发动作事件。...当用户点击提交按钮程序会检查哪些复选框被选中,并以弹框的方式显示用户选择的选项。 六、单选按钮(JRadioButton) Swing 通过类 JRadioButton 实例化单选按钮对象。...它们都被添加到一个JPanel,并且通过ButtonGroup对象进行分组,以确保只能选择一个选项。当选择一个选项,会显示相应的信息JLabel。...而AWT的 List初始化列表,不能添加列表选项;此外,JList 所创建的列表的选项可以是任何类型,不再局限于文本字符串。

    9510

    Java事件处理基础实例:处理按钮点击+捕获窗口事件+改变观感

    = . . .; JButton button = new JButton("Ok"); button.addActionListener(listener); 现在,只要按钮产生了一个“动作事件”,...下面是两个例子: 将按钮添加到面板需要调用add方法(十分容易记忆)。add方法的参数指定了将要放置到容器的组件。例如, 图8-2显示了结果。...当面板包含多个用户界面元素,会变得格外混乱。 警告:有些程序员采用另外一种方式多个事件源共享的监听器对象找出事件源。...Swing程序启动读取一次swing.properties文件。 第二种方式是动态地改变观感。...正规的程序,往往希望用户确认没有丢失所做工作之后再关闭程序。 例如,当用户关闭框架,可能希望弹出一个对话框来警告用户没有保存的工作有可能会丢失,只有在用户确认之后才退出程序

    3.5K30

    Java 期末复习 (已完结)

    6 子类不会继承父类的构造器*,而是子类被实例化时会默认调用父类的空构造器 如果父类的构造器被 重载,那么子类的构造器也必须初始化父类的构造器 举个例子哈 ?...方法区 逻辑上 可以认为****堆 ? 10 Object类 ? 11 垃圾回收 ? ? ? ? 7 ? ? ? 自动装箱? ? 自动拆箱? ?...):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件; ★Swing,对话框有几种?...★线程是能独立运行的程序 ★在编写访问数据库的Java程序时,ResultSet对象的作用是 存储查询结果 ★ this和super ➡不能用在 main() 方法 ★ 字节流,所有的InputStream...★Swing,带有滚动条的面板的类名是__JScrollPanel____ ★组合框(JComboBox)是____文本框和列表的组合 ★Java程序可以用纯Java的___JDBC_**驱动程序

    95330

    java监听器从入门到放弃?

    java的awt大量的运用到了此种模式,例如可以给button对象添加一个点击事件,当鼠标点击,就会调用事件处理程序。...又如:javascript事件也运用到了此种模式,当用户点击鼠标,会触发一个鼠标点击事件去调用程序员定义的事件处理程序。下面就以GUI编程来说明监听器。...,和Servlet, Filter一样,Listener也是单例的,也就是tomcat容器只会加载一次。...spring就是使用监听器web容器启动执行初始化的。...,为了避免访问次数的丢失,应当将服务器停止将访问次数放到文件中保存,服务器启动再从文件读取,这个操作应当在ServletContextListener监听器做。

    2.8K31

    Swing的介绍

    GUI)器件如 : 文本框,按钮,分隔窗格和表.Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT.它们是JFC一部分.它们支持可更换的面板和主题...Swing组件各种平台上运行时可以保证具有相同的图形界面外观....Swing提供的这些优势,让Java图形界面程序真正实现了"Write Once,Run Anywhere" 的目标.除此之外,Swing还有如下特征....既模型-视图-控制器)设计模式,其中模型(Model)用于维护组件的各种状态,视图(View)是组件的可视化表现,控制器(Controller)用于控制对于各种事件,组件做出怎样的响应.当模型发送改变,...对象,Swing组件的模型是自动设置的,因此一般都使用JButton,而无须关系ButtonModel对象.因此, Swing组件的模型是自动设置的,因此一般都使用JButton,而无须关系ButtonModel

    1.1K20

    java swing入门教程_java swing基础(菜鸟教程学习)

    AWT是JFC的一部分,支持可更换的面板和主题(各种操作系统默认的特有主题),然而并不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。...javax.swing.*; public class HelloWorldSwing{ 创建并显示GUI,出于线程安全的考虑 //这个方法事件调用线程调用 private static void...JFrame java的GUI程序的基本思路是以JFrame为基础,说白了就是窗体屏幕它是屏幕上window的对象,能够最大化,最小化,关闭。...可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容何处对齐。默认情况下,标签在显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐。而只显示图像的标签则水平居中对齐。...JPasswordField 允许我们输入了一行字像输入框,但隐藏星号(*)或点创建密码(密码) 学习过javascript的同学应该明白 类似的注册表单嘛 JButton JButton类的实例。

    2.5K20

    GridBagLayout 以及 GridBagConstraints 用法「建议收藏」

    Constraints 对象指定组件在网格的显示区域以及组件在其显示区域中的放置方式。”...使用情景举例:一个很大的窗口(如300*300)添加一个按钮(原始大小40*30)。...(3)GridBagConstraints.anchor 当组件小于其显示区域,用于确定将组件置于何处(显示区域中)。可能的值有两种:相对和绝对。...例如:一个很大的窗口(如300*300)添加两个按钮(也可以是面板)(原始大小 40*30),默认的,你会发现两个按钮分别处于上下两个等大小的区域中,且只占用了一小部分,没有被按钮占用的区域就被称为额外区域...建议定义出gridx,gridy的位置以便以后维护程序。gridx=0,gridy=0放在0行0列。

    1.4K30

    【Java】解决:java.util.TooManyListenersException

    Java开发,java.util.TooManyListenersException是一个常见的异常,特别是处理事件监听器。...一、分析问题背景 java.util.TooManyListenersException通常发生在使用事件监听机制的Java应用程序。...许多Java类(如JButton、JTextField等Swing组件)允许我们为其添加事件监听器(如ActionListener、MouseListener等),以便在特定事件发生执行某些操作。...例如,处理自定义事件,某些自定义事件源类可能只支持一个监听器。当多次调用addXxxListener方法,就会导致异常。...使用复合模式:如果需要执行多个动作,可以将这些动作整合到一个监听器,而不是为每个动作注册单独的监听器。 事件模型设计:设计自定义事件源,明确监听器的数量限制,并在文档中注明,以避免误用。

    9610

    百度地图开发1

    Key type 选择“for mobile”,安全码是Android签名证书的证书指纹 (SHA1)值 + “;” + 你的应用程序包名,所以当你配置好了API key 你不能随意更换应用程序的包名,...如果更换了包名我们需要重新配置API key,接下来我们来介绍怎么获取数字签名 我们知道我们开发的Android程序是需要给他签名的,如果没有签名是不允许被安装到手机或者模拟器的,那么你会有疑问,我平常开发的应用确实没签名...布局文件添加百度地图控件, <?xml version="1.0" encoding="utf-8"?...    }   @Override protected void onResume() {   //MapView的生命周期与Activity同步,当activity挂起需调用...       }   @Override protected void onPause() {   //MapView的生命周期与Activity同步,当activity挂起需调用

    1.7K70

    深入Java Swing用户界面组件布局管理器:网格布局+面板+边界布局

    下面快速回顾一下该程序的编写过程: 1)在按钮的构造器设置标签字符串定义每个按钮的 外观,例如: JButton yellowButton = new JButton("Yellow") 2)然后把每个按钮添加到面板...正如你所看到的,按钮居中显示一行,当一行的空间不够,将显示新的一行上。 即使用户对框架进行缩放,这些按钮也会显示面板的中央,如图9-7所示。...图9-11的计算器程序使用了网格布局来安排计算器按钮。当缩放窗口,计算器的按钮随之变大或变小,但所有的按钮尺寸相同。...panel.add(new JButton("1")); panel.add(new JButton("2")); 例9-1是计算器程序的源代码。...当然,极少有应用程序具有与计算器的外表一样的布局。实际应用,小的网格(通常仅仅一行或者一列)组织窗口的布局区域比较有用。

    3.5K30

    超详细的Java容器、面板及四大布局管理器应用讲解!

    本文主要讲解Swing程序设计容器、面板及四大布局管理器的详细使用、包括实例程序讲解、使用注意及使用技巧分享、敬请阅读! Hello!你好哇,我是灰小猿!...使用JScrollPane面板需要注意以下两个问题: JScrollPane面板只能布置一个控件, JScrollPane面板不能使用布局管理器 因此如果想要在JScrollPane面板显示多个控件...,就需要首先将控件布局JPanel面板,之后将JPanel面板作为一个整体组件添加到JScrollPane面板, 通过下面程序对JScrollPane面板进行实践: 以下程序JScrollPane...含义 BorderLayout.NORTH 容器添加组件,组件置于顶端 BorderLayout.SOUTH 容器添加组件,组件置于底端 BorderLayout.EAST 容器添加组件...,组件置于右端 BorderLayout.WEST 容器添加组件,组件置于左端 BorderLayout.CENTER 容器添加组件,组件置于中间开始填充,直到与其他组件边界连接 关于边界布局管理器的具体使用可以参考如下实例

    2.7K10

    java swing一篇轻松学习(高考后可以自学)

    600, 300, 1200, 200); //创建一个面板对象 JPanel jp=new JPanel(); //创建一个文本标签 JLabel jl=new JLabel("祝愿程序员都会开心幸福安康...=new JButton("·表格信息"); JButton button4=new JButton("右·很少用到"); JButton button5=new JButton("下·备案号啥的...text) 设置按鈕的文本 void setMargin(Insets m) 设置按钮边框和标签之间的空白 void setMnemonic(int nmemonic) 设置按钮的键盘快捷键,所设置的快捷键实际操作需要结合...Alt 键进行实现 void setPressedIcon(Icon icon) 设置按下按钮的图标 void setSelectedIcon(Icon icon) 设置选择按鈕的图标 void...list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollPane.setViewportView(list); //滚动面板显示列表

    9.4K10

    Java的屏幕共享

    本文中,将展示一种方法,该方法允许使用JxBrowser的功能在不同 PC 上运行的两个 Java 应用程序之间实现屏幕共享。...当流媒体开始捕获,我们将其屏幕视图作为视频流接收。为了显示它,我们接收器端使用内置的 HTML5 视频播放器。打开两个浏览器窗口查看是否正常。该项目的源代码可在GitHub 上获得。...();});复制代码接收器应用程序接收器应用程序,我们将显示共享屏幕。...结论本文中,展示了如何在一个 Java 应用程序中共享屏幕并使用 JxBrowser 另一个应用程序显示它。 我创建了一个可以共享屏幕的简单 JavaScript 应用程序。...然后使用 JxBrowser 将它集成到两个 Swing 应用程序。借助 JxBrowser 提供的捕获 API,丰富了标准 Java 应用程序的屏幕共享功能。

    1.9K20
    领券