动态添加的面板仅在调整大小时才可见

rup*_*iab 0 java swing jpanel

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(); 
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的SearchPanelClass和AddMaterialPanel是两个自定义面板,我想根据menuitem点击添加.但是只有在调整窗口大小时才能看到面板.任何人都可以告诉我在窗口调整大小的后端调用哪些过程?

请掌舵我......

提前致谢..

Hov*_*els 7

不要忘记打电话,revalidate()repaint()在已添加JPanel或从中删除JPA的容器上.

  • revalidate() 将告诉容器让其布局管理器重新布局它所拥有的所有组件.
  • repaint()将告诉组件重绘自己及其所有子项.这并不总是需要,但经常需要,特别是如果组件被移除.

此外,永远不要==像在这里那样比较字符串:

public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();
    if(command == "Panel1")
    {
        changePanel(panel1);
    }
    if(command =="Panel2")
    {
        changePanel(panel2);
    }

   }

 }
Run Code Online (Sandbox Code Playgroud)

==运营商将检查两个String对象是同一个,有些东西你不关心.而是使用String方法equals(...)equalsIgnoreCase(...)测试两个字符串是否包含相同顺序的相同字符.所以,例如:

String command = e.getActionCommand();
if("Panel1".equalsIgnoreCase(command)) {
    changePanel(panel1);
} else if("Panel2".equalsIgnoreCase(command)) {
    changePanel(panel2);
}
Run Code Online (Sandbox Code Playgroud)

编辑:更好的是,使用CardLayout交换JComponents:CardLayout教程CardLayout API

编辑2:请注意,您的使用org.jdesktop.application.SingleFrameApplication意味着你使用的是JSR 296:Swing应用程序框架库,而这个库的状态的审查表明,由于注意到它已经被撤销在这里.因此,目前似乎不支持或更新此库.