监听/处理JPanel事件



女士们,先生们,,晚上好

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

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

除了这个小问题之外,这个系统的一切都很好:每次我建立一个新的JPanel或更改回现有的JPanell时(一般来说,每次JPanel出现时),我都想触发一些方法。

为了做到这一点,我尝试实现ComponentListener的componentShown(ComponentEvente)方法,并将ComponentListener添加到我在JFrame中心放置的JPanel中,但它没有起作用。之后,我做了一些研究,发现这个componentShown(@ComponentListener)方法只有在JPanel的可见性发生变化(从不可见变为可见或相反)时才有效。不幸的是,我并没有改变JPanel的可见性,只是用另一个替换它:删除当前的,然后添加新的。下面的代码说明了如何替换JPanels。

// 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();

这就是我所拥有的。如果你能帮我,我将不胜感激。

我认为这个问题对应于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);
        }
    }
}

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

如有疑问,请咨询API。

最新更新