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

时间:2014-07-18 12:09:13

标签: java swing netbeans jframe jpanel

我是使用java开发GUI的新手,我使用netbeans来帮助我设计各种jPanel。现在我有一个带有jFrame的类,我将在左侧放置一个菜单,右边有一个jPanel,当有人在左边做出选择时,我想调用jPanel类并将其放入那个面板在右边。我已经看过各种不同的例子,但我无法让它发挥作用。这是我的文件结构如何工作

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

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

3 个答案:

答案 0 :(得分:1)

您可能希望使用可让您在视图(面板)之间切换的CardLayout。您可以在How to Use CardLayout查看更多信息。您只需拨打cardLayout.show(...)即可显示所需的面板(可以这么说)。

同样对于Netbean构建器工具,您可以看到How to use CardLayout with Netbeans GUI Builder

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

答案 1 :(得分:0)

您可以使用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);
       }
});

另一种方法是为potentialPanels面板使用CardLayout

根据您对上述帖子的评论,如果您担心有很多小组,那么您可以使用ArrayList来包含所有小组。然后,您可以将其中一个面板设置为可见,暂时将其从列表中删除,然后迭代列表的其余部分,将它们全部设置为"隐藏",然后再将该可见面板添加到列表中。使用CardLayout会更有效率,您可以使用CardLayout显示单个面板,而其他面板隐藏",实际上采用相同的方式,但内置show功能,避免ArrayList

的混乱

答案 2 :(得分:0)

完全同意上述内容。我非常成功地使用了CardLayout。

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