Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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-使用Netbeans隐藏/显示外部JPanel?_Java_Swing_Netbeans_Jframe_Jpanel - Fatal编程技术网

Java-使用Netbeans隐藏/显示外部JPanel?

Java-使用Netbeans隐藏/显示外部JPanel?,java,swing,netbeans,jframe,jpanel,Java,Swing,Netbeans,Jframe,Jpanel,我是用java开发GUI的新手,我正在使用netbeans来帮助我设计各种JPanel。现在我有一个类,里面有我的jFrame,我会在左边放一个菜单,右边有一个jPanel,当有人在左边做一个选择时,我想调用jPanel类并将它放在右边的面板中。我见过各种不同的例子,但我无法让它发挥作用。下面是我的文件结构的工作原理 java(创建到db的连接并调用jframe类) java(左侧包含菜单,右侧包含空jpanel) panel1.java(在netbeans中设计的panel类i)panel2

我是用java开发GUI的新手,我正在使用netbeans来帮助我设计各种JPanel。现在我有一个类,里面有我的jFrame,我会在左边放一个菜单,右边有一个jPanel,当有人在左边做一个选择时,我想调用jPanel类并将它放在右边的面板中。我见过各种不同的例子,但我无法让它发挥作用。下面是我的文件结构的工作原理

  • java(创建到db的连接并调用jframe类)
  • java(左侧包含菜单,右侧包含空jpanel)
  • panel1.java(在netbeans中设计的panel类i)panel2.java
  • panel3.java

现在,当有人在“我的菜单”中选择panel1时,我如何将其放入jframe中?

您可能希望使用CardLayout,以便在视图(面板)之间切换。你可以在网站上看到更多。您只需调用
cardLayout.show(…)
即可显示所需的面板(可以这么说)

同样对于Netbean builder工具,您可以看到


另见。您可以将类面板拖放到设计视图中

您可以使用
CardLayout
,也可以使用一些setVisible()调用。我不确定您是否询问如何设置框架,但您可以使用BoxLayout:

JFrame f = new JFrame();
JPanel wholePanel = new JPanel();
wholePanel.setLayout(new BoxLayout(wholePanel, BoxLayout.X_AXIS)); // panel with a vertical split, i.e. new panels get added as new "columns"
wholePanel.add(menuPanel);

JPanel potentialPanels = new JPanel(); // use this to act as a single panel on the right
potentialPanels.add(panel1); // it'll contain both panel1 and panel3, but only show one at a time
potentialPanels.add(panel3);
panel3.setVisible(false); // panel 3 invisible by default

showPanel1Button.addActionListener(new ActionListener(){ // activates upon selection
   @Override
   public void actionPerformed(ActionEvent e) { 
      panel1.setVisible(true); // show panel 1
      panel3.setVisible(false); // /hide panel 3
   }
});

showPanel3Button.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) { 
          panel1.setVisible(false); // do the reverse: hide panel 1, show panel 3
          panel3.setVisible(true);
       }
});
另一种方法是为
潜在面板
面板使用


根据你在上述帖子上的评论,如果你担心有很多面板,那么你可以使用
ArrayList
来包含所有面板。然后,您可以将其中一个面板设置为可见,暂时将其从列表中删除,并将其全部设置为“不可见”,然后将该可见面板再次添加到列表中。使用CardLayout会更有效,其中显示单个面板,其他面板“隐藏”,有效方式相同,但使用内置的
show
功能,避免了
ArrayList
的混乱,完全符合上述要求。我已经非常成功地使用了CardLayout


但不要忘记对任何更改的组件调用revalidate(无论是否使用CardLayout)。这告诉UI它需要更新到屏幕。

我的一个问题是,通过使用卡片布局,我必须将所有内容都放在一个java文件中,对吗?我很犹豫是否这样做,因为考虑到这个项目的范围,这个文件将很快变得巨大。我正在做的是将基于文本/终端的程序转换为GUI程序,而我以前从未做过如此大规模的事情。所以在我看来,把20多个面板放在不同的文件中似乎比把它们放在同一个文件中更容易管理。不,谁说的?您可以轻松地将面板类拖放到主面板上(使用CardLayout)。请参阅最后一个链接。我不认为20个面板是个问题。我的第一个评论是,我在编辑。我是堆栈溢出新手,不知道enter键。如果您使用的是生成器工具,请参阅上面的链接。不要从调色板中添加面板,只需添加面板类,并为每个面板命名即可。按下菜单时,显示相应的面板另一种可能的设计是创建一个面板类(带有Cardlayout)以仅容纳所有其他面板。在该类中有一个方法来
显示(String panelName)
。这将使主类更干净