import org.jdesktop.application.SingleFrameApplication;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import org.jdesktop.application.FrameView;
public class Welcome extends FrameView
{
SearchPanelClass panel1 = new SearchPanelClass();
AddMaterialPanel panel2 = new AddMaterialPanel();
Container container= AutomobileApplication.getApplication().getMainFrame();
public Welcome(SingleFrameApplication app)
{
super(app);
initMenu();
}
private class MenuAction implements ActionListener {
private SearchPanelClass panel;
private MenuAction(SearchPanelClass pnl)
{
this.panel = pnl;
}
private AddMaterialPanel AddMaterialPan;
private MenuAction(AddMaterialPanel pnl)
{
this.AddMaterialPan = pnl;
}
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command == "Panel1")
{
changePanel(panel1);
}
if(command =="Panel2")
{
changePanel(panel2);
}
}
}
private void initMenu() {
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("Menu");
JMenuItem menuItem1 = new JMenuItem("Panel1");
JMenuItem menuItem2 = new JMenuItem("Panel2");
menubar.add(menu);
menu.add(menuItem1);
menu.add(menuItem2);
this.setMenuBar(menubar);
menuItem1.addActionListener(new MenuAction(panel1));
menuItem2.addActionListener(new MenuAction(panel2));
}
private void changePanel(JPanel panel) {
container.removeAll();
setComponent(panel);
panel.setVisible(true);
container.doLayout();
}
}
这里的SearchPanelClass和AddMaterialPanel是我想根据menuitem点击添加的两个自定义面板。但是只有在调整窗口大小时才能看到面板。任何人都可以告诉我在窗口大小调整后在后端调用哪些过程吗?
请掌舵我......
提前致谢..
答案 0 :(得分:7)
不要忘记在已添加JPanel或从中删除JPanels的容器上调用revalidate()
和repaint()
。
revalidate()
将告诉容器让其布局管理器重新布置它所拥有的所有组件。repaint()
会告诉组件重绘自己及其所有子项。这并不总是需要,但经常需要,特别是如果组件被移除。此外,请勿使用==
来比较字符串:
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command == "Panel1")
{
changePanel(panel1);
}
if(command =="Panel2")
{
changePanel(panel2);
}
}
}
==
运算符将检查两个String对象是否相同,这是您不关心的事情。而是使用String方法equals(...)
或equalsIgnoreCase(...)
,它将测试两个字符串是否包含相同顺序的相同字符。所以,举例来说:
String command = e.getActionCommand();
if("Panel1".equalsIgnoreCase(command)) {
changePanel(panel1);
} else if("Panel2".equalsIgnoreCase(command)) {
changePanel(panel2);
}
编辑:更好的是,使用CardLayout交换JComponents:The CardLayout Tutorial和the CardLayout API
编辑2:请注意,使用org.jdesktop.application.SingleFrameApplication
意味着您正在使用JSR 296:Swing应用程序框架库,并且对此库状态的审查表明它具有如所述here被撤回。因此,目前似乎不支持或更新此库。