3

先生们女士们晚上好,

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

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

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

为了做到这一点,我尝试实现 ComponentListener 的 componentShown(ComponentEvent e) 方法,并将 ComponentListener 添加到我放在 JFrame 中心的 JPanel 中,但它不起作用。在此之后,我做了一些研究,发现这个 componentShown (@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();

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

4

2 回答 2

2

我认为这个问题与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);
        }
    }
}
于 2012-04-07T07:55:16.417 回答
2

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

如有疑问,请查阅 API。

于 2012-04-07T02:28:25.923 回答