Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态添加的面板仅在调整大小时可见_Java_Swing_Jpanel - Fatal编程技术网

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

Java 动态添加的面板仅在调整大小时可见,java,swing,jpanel,Java,Swing,Jpanel,这里SearchPanelClass和AddMaterialPanel是我想根据菜单项单击添加的两个自定义面板。但面板仅在调整窗口大小时可见。有人能告诉我,在窗口调整的后端调用了哪些过程吗 请驾驶我 提前感谢。不要忘记在添加或删除JPanel的容器上调用revalidate()和repaint() revalidate()将告诉容器让其布局管理器重新布局它所容纳的所有组件 repaint()将告诉组件重新绘制自身及其所有子组件。这并不总是需要的,但经常需要,尤其是在拆下组件的情况下 此外,切

这里SearchPanelClass和AddMaterialPanel是我想根据菜单项单击添加的两个自定义面板。但面板仅在调整窗口大小时可见。有人能告诉我,在窗口调整的后端调用了哪些过程吗

请驾驶我


提前感谢。

不要忘记在添加或删除JPanel的容器上调用
revalidate()
repaint()

  • revalidate()
    将告诉容器让其布局管理器重新布局它所容纳的所有组件
  • repaint()
    将告诉组件重新绘制自身及其所有子组件。这并不总是需要的,但经常需要,尤其是在拆下组件的情况下
此外,切勿使用
==
来比较字符串,就像您在这里所做的那样:

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(); 
  }
}
=
操作符将检查两个字符串对象是否是一个相同的对象,这是您不关心的。而是使用字符串方法
equals(…)
equalsIgnoreCase(…)
,这将测试两个字符串是否以相同顺序包含相同的字符。例如,你应该:

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

   }

 }
编辑:更好的方法是使用卡片布局交换JComponents:and


编辑2:请注意,您使用的
org.jdesktop.application.SingleFrameApplication
意味着您正在使用JSR 296:Swing应用程序框架库,对该库状态的检查表明,它已按说明撤回。因此,该库当前似乎不受支持或更新。

您可以添加main(String[]args)吗?请学习java命名约定并坚持这些约定。@kleopatra这只是一种练习,但也需要一些建议。欢迎使用。再次,认真考虑使用卡布局,因为它可以使你的生活更容易。@ USE1536963:你可以接受这个答案,点击左边的。是的,我已经实现了卡式布局,但你能帮助我在菜单动作事件?我想添加“Menu2”作为菜单(而不是菜单项),那么我需要做什么?因为我已经做了卡片布局,但是没有实现菜单,提前谢谢@用户1536:考虑问一个新的问题,给出相关的细节,并发布一个说明你的问题。
String command = e.getActionCommand();
if("Panel1".equalsIgnoreCase(command)) {
    changePanel(panel1);
} else if("Panel2".equalsIgnoreCase(command)) {
    changePanel(panel2);
}