【问题标题】:Java - Using Netbeans to hide/show external jPanels?Java - 使用 Netbeans 隐藏/显示外部 jPanel?
【发布时间】:2014-09-09 13:45:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: java swing netbeans jframe jpanel


    【解决方案1】:

    您可能希望使用可让您在视图(面板)之间切换的 CardLayout。您可以在How to Use CardLayout 看到更多信息。您只需拨打cardLayout.show(...),您想要的面板就会出现(可以这么说)。

    同样对于 Netbean builder 工具,你可以看到How to use CardLayout with Netbeans GUI Builder

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

    【讨论】:

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

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

    另一种方法是将CardLayout 用于potentialPanels 面板。

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

    【讨论】:

      【解决方案3】:

      完全同意上述观点。我已经非常成功地使用了 CardLayout。

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

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 2013-02-09
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多