当前位置: 首页 > 知识库问答 >
问题:

侦听/处理JPanel事件

空成天
2023-03-14

女士们先生们晚上好,

我有一个Java Swing的问题,我无法解决,也许你可以帮助我。在这里:

  • 我有一个使用BorderLayout的JFrame和许多JPanel
  • 每次我需要设置一个新屏幕(即,从主菜单,当单击搜索按钮时,转到搜索菜单),我只需删除位于中心的组件(JPanel),并将新屏幕(新JPanel)放在中心
  • 这样,我不会在每次我想显示新屏幕时调用所有的页眉和页脚对象

这个系统一切正常,除了这个小问题:每次我放一个新的JPanel或者改回一个现有的JPanel时(一般来说,每次JPanel出现时),我想触发一些方法。

为了做到这一点,我试图实现组件管理器的组件显示(组件事件event e)方法,并在JPanel中添加了一个组件管理器,我把它放在JFrame的中心,但它不起作用。在此之后,我做了一些研究,发现这个组件显示(@ComponentListener)方法仅在JPanel的可见性发生变化(从不可见到可见或相反)时才有效。不幸的是,我没有改变JPanel的可见性,只是用另一个替换它:删除当前一个,然后添加新的那个。下面的代码说明了我如何替换 JPanel。

// Get the JPanel located in the center of our JFrame
JPanel currentView = (JPanel) myFrame.getContentPane().getComponent( 2 );

if ( currentView != null )
{
   // Remove it from the JPanel         
   myFrame.getContentPane().remove( currentView );
}

// Add the new JPanel    
myFrame.getContentPane().add( otherView, BorderLayout.CENTER );

// Pack the JFrame and show it
myFrame.pack();

这是我所知道的。如果你能帮我,我会非常感激。

共有2个答案

习洲
2023-03-14

我强烈建议您听听@Jeffrey给出的建议,但是如果您继续进行此设计,那么实现 ContainerListener 接口可能会很有用。

如有疑问,请咨询API。

董意蕴
2023-03-14

我认为这个问题与HierarchyListener相对应

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ContainerListener extends JFrame {

    private static final long serialVersionUID = 1L;

    public ContainerListener() {
        super("Test");
        setContentPane(new TestPanel());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] parameters) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ContainerListener containerListener = new ContainerListener();
            }
        });
    }

    private class TestPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        TestPanel() {
            setLayout(new FlowLayout(FlowLayout.LEFT));
            add(new JButton(new AbstractAction("Add label") {

                private static final long serialVersionUID = 1L;
                private int n = 0;

                @Override
                public void actionPerformed(ActionEvent event) {
                    TestPanel.this.add(new JLabel("Label " + ++n));
                    validate();
                }
            }));
            addHierarchyListener(new HierarchyListener() {

                @Override
                public void hierarchyChanged(HierarchyEvent e) {
                    System.out.println("Components Change: " + e.getChanged());
                    if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
                        if (e.getComponent().isDisplayable()) {
                            System.out.println("Components: " + e.getChanged());
                        } else {
                            System.out.println("Components: " + e.getChanged());
                        }
                    }
                }
            });
            addContainerListener(new ContainerAdapter() {

                @Override
                public void componentAdded(ContainerEvent event) {
                    System.out.println("componentAdded : " + event.getChild() + "containerName" + " was added");
                }
            });

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }
}
 类似资料:
  • 问题内容: 我正在尝试添加一个包含一个的键侦听器。 当收到ctrl + tab时,应该切换标签。 但是按键事件从未发送过,我尝试将其添加到面板和选项卡式对象中,但是没有成功。 这是我的代码 问题答案: 通常,正确的Swing组件不会拦截您的按键事件。您必须了解,光标下方的第一个组件将收到键盘事件。如果您使用键盘选择一个按钮,则将是这个JButton接收按键事件。 为了确保获得所有这些事件,您不必在

  • 是否可能有一个全局鼠标运动监听器,根据点击的JPanel的内容而具有不同的效果(仅使用一个鼠标运动监听器)? 例如:我有一个JFrame,其中添加了两个JPanel,并在JFrame中添加了一个鼠标运动监听器。当我点击一个JPanel时,我希望屏幕能够调整大小,但当我点击另一个JPanel时,我希望JFrame能够被拖动。我认为这可以通过使用JLabel来完成,使用JLabel的文本进行检查,与J

  • 问题内容: 我目前正在研究Socket.io的Java实现,可从此处获取:netty- socketio 我已经启动并运行了服务器,并且它在客户端和服务器之间很好地接收/发送消息,但是我需要让某些消息被接收时触发事件,这就是我的困惑。 这是我的代码: } 本质上,我想发生的是从客户端收到特定消息时,我需要另一个类中的函数才能运行。我花了持续两个小时阅读,,和事件处理程序,但我真的不知道如何处理此问

  • 在本例中,客户端通过创建新的EventSource连接到Node Express服务器。服务器在初始连接时发送SSE事件,然后每隔30秒发送一次。问题是客户端的onmessage处理程序不是由连接时发送的初始SSE事件触发的,而是由所有后续事件触发的。如果我在建立连接后立即停止服务器,这实际上会在客户端中触发一个事件,表明数据实际上是在片刻之前没有处理的情况下收到的(或者初始res.write仅在

  • 我有一个spring JMS侦听器,它正在侦听队列。一旦消息到达输入队列,它就会对消息进行某些处理,并将消息放入多个其他队列进行进一步处理(我们可以将这些其他队列称为输出队列)。在将消息发布到其他输出队列时,如果将消息发布到其中一个输出队列可能会由于任何原因而失败,我希望确保在失败之前完成的其他发布回滚到输出队列。基本上我想确保它是原子操作。在侦听器/容器上是否有任何注释/配置可用于在单个事务中实

  • 我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?