先生们女士们晚上好,
我有一个Java Swing无法解决的问题,也许您可以帮助我.这里是:
>我有一个使用BorderLayout的JFrame和许多JPanels.
>每当我需要建立一个新屏幕时(例如,从主菜单中,单击“搜索”按钮时,转到“搜索”菜单),我只需删除位于中间的组件(JPanel),然后将新的屏幕(新的JPanel)放在中间.
>这样,我不需要每次都想放一个新屏幕时都调用所有的页眉和页脚对象.
除了这个小问题,一切都可以在该系统上正常运行:我想每次安装新的JPanel或改回现有的JPanel时都触发一些方法(通常来说,每次出现JPanel时).
为了做到这一点,我尝试实现ComponentListener的componentShown(ComponentEvent e)方法,并将一个ComponentListener添加到我放置在JFrame中心的JPanel中,但它不起作用.之后,我进行了一些研究,发现只有在更改JPanel的可见性(从不可见到可见或相反)时,componentShown(@ComponentListener)方法才起作用.不幸的是,我没有更改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();
这就是我所拥有的.如果您能帮助我,我将不胜感激.
解决方法:
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);
}
}
}
标签:event-listener,event-handling,swing,jpanel,java
来源: https://codeday.me/bug/20191101/1983933.html