先生们女士们晚上好,
我有一个无法解决的 Java Swing 问题,也许你可以帮助我。这里是:
- 我有一个使用 BorderLayout 的 JFrame 和许多 JPanel。
- 每次我需要建立一个新屏幕(即从主菜单中,单击搜索按钮时,转到搜索菜单),我只需删除位于中心的组件(JPanel),然后放置新屏幕(新的 JPanel)位于中心。
- 这样,每次我想打开新屏幕时,我就不会调用所有页眉和页脚对象。
除了这个小问题之外,这个系统一切正常:我想每次放置一个新的 JPanel 或改回现有的 JPanel 时触发一些方法(一般来说,每次出现 JPanel 时)。
为了做到这一点,我尝试实现 ComponentListener 的 componentShown(ComponentEvent e) 方法,并将 ComponentListener 添加到我放在 JFrame 中心的 JPanel 中,但它不起作用。之后,我做了一些研究,发现这个 componentShown (@ComponentListener) 方法仅在 JPanel 的可见性发生变化(从不可见到可见或相反)时才有效。不幸的是,我不会更改 JPanel 的可见性,只是将其替换为另一个 JPanel:删除当前的 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();
这就是我所拥有的。如果您能帮助我,我将非常感激。
我认为这个问题对应于层次结构监听器 http://docs.oracle.com/javase/7/docs/api/java/awt/event/HierarchyListener.html,用于比较
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);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)