女士们,先生们,,晚上好
我有一个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。