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

标签 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(); 
  }
}

这里SearchPanelClass和AddMaterialPanel是两个自定义面板,我想根据菜单项点击添加它们。但面板仅在调整窗口大小时才可见。谁能告诉我在调整窗口大小时后端调用了哪些程序?

请 Helm 我...

提前致谢..

最佳答案

不要忘记在添加或删除 JPanel 的容器上调用 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 来交换 JComponent:The CardLayout Tutorialthe CardLayout API

编辑 2: 请注意,您使用 org.jdesktop.application.SingleFrameApplication 意味着您正在使用 JSR 296:Swing 应用程序框架库,并查看该库的状态显示它已被撤回,如所述 here 。因此目前看来该库并未受到支持或更新。

关于java - 动态添加的面板仅在调整大小时才可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236726/

相关文章:

java - 如何将油漆(图形g)添加到另一个类中?

java - 扩展 JPanel 类中的 KeyListener

java - JPanel - 网格布局

java - 我尝试使用的 JPanel 的令人困惑的属性

java - 在 arraylist<JPanel> 中添加 JPanel

Java数组索引越界异常修复

java - 如何等待计数器完成

java - 如何在 Eclipse 中找到 ecj 版本?

java - 具有网格布局和 JButtons 的 JPanel 无法加载/工作

java - ActionListener问题