首页
学习
活动
专区
工具
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常用组件

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

    11710

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

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

    20210

    Swing组件概述

    例如:一个文本模型中的方法有:在当前文本中添加或者删除字符以及把当前文本作为一个字符串返回等。再次强调,模型是完全不可见的,显示存储在模型中的数据是视图的工作。 ​...在许多情况下,我们需要用户 只选择几个框中的一个。当用户选择另外一个时,前一个选择就自动取消。...最常见的用法是在一个面板周围设置一 种边界,然后用其他用户界面元素(如单选按钮)来填充该面板。...当用户点击该 组件时,一列选择项就会下拉弹出,然后用户可以选择其中的一个。...例7​​ 问题的描述: 文件对话框(JFileChooser)的使用 解决方案: 当你编写一个应用程序时,你常常需要打开和保存文件。

    4710

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

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

    3.7K30

    Java 期末复习 (已完结)

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

    98430

    java监听器从入门到放弃?

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

    2.9K31

    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.6K20

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

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

    1.6K30

    【Java】解决:java.util.TooManyListenersException

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

    10310

    深入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.7K30

    GridLayout和

    GridLayout布局管理器是以表格形式进行管理的,在使用此布局管理器时必须设置显示的行数和列数,GridLayout类的构造方法如表11.9所示。...例12-18运行结果 图12.20中,运行程序创建Frame窗体后,将布局设置为使用GridLayout布局管理器,设置以两行三列布局,并设置组件之间的水平和垂直间距都为10,之后添加6个按钮到Frame...RELATIVE,表示当前组件在其行或列上为倒数第二个组件;weightx和weighty的默认值是0,例如容器中有2个组件,weightx分别为2和1,当容器宽度增加30个像素时,两个容器分别增加20...例12-22运行结果 图12.22中,运行程序弹出Frame窗口,创建一个窗口对象和两个面板对象jPanel1、jPanel2,将面板jPanel2设置成1行4列的网格式页面布局,将面板jPanel1的页面布局设置为卡片式...jFrame调用add()方法将两个面板添加到窗口jFrame中,jPanel1调用add()方法将三个对象添加到面板jPanel1中,将名字为jTextField的文本框显示在卡片式布局的页面上,将4

    4500

    百度地图开发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.8K70

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

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

    2.9K10
    领券