【问题标题】:JPanel deforms my LayoutJPanel 使我的布局变形
【发布时间】:2017-05-29 21:21:38
【问题描述】:

我正在使用 NetBeans 为学校工作。我有一个巨大的 JPanel,其中包含一个巨大的 JFrame。那个 JFrame 作为 5 个小 JFrame,1 个是带有按钮的菜单,其他的是带有文本的框,当我在按钮中选择时它们会交换。 当一个框显示其他框不可见时,我使用以下代码(不知道它是否是最好的):

     public ConversorUI() {
            initComponents();
           PanelVazio.setVisible(true);
           PanelTemp.setVisible(false);
           PanelComp.setVisible(false);
           PanelMoedas.setVisible(false);
           this.pack();
        }

我的问题是,当我运行我的程序时,我有一个很大的空间,什么都没有,只有在它下面才会出现组件。我希望它们出现在我的窗口顶部。我能做些什么 ?

回答 经过一段时间的搜索,我才意识到我可以将布局从 JPanel 设置为卡片布局,并在彼此之上创建 JPanel,并使用代码激活它们:

    private void DinheiroButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
        //Remove Panels
        CAIXA.removeAll();
        CAIXA.repaint();
        CAIXA.revalidate();

        //Add Panels
        CAIXA.add(DinheiroBox);
        CAIXA.repaint();
        CAIXA.revalidate();
    }        

【问题讨论】:

  • 为了更好的帮助,请创建并发布一个有效的minimal reproducible example,一个小型,实际上是最小的程序,我们可以不加改动地编译和运行,没有外部依赖(例如数据库或图像),这直接向我们展示了您的问题。还可以考虑发布两张图片的链接,一张显示所需的 GUI,另一张显示观察到的。
  • 1) 除了@HovercraftFullOfEels 建议的 MCVE,提供 ASCII 艺术或 GUI 的 预期 布局的最小尺寸的简单绘图,如果可调整大小,则具有更大的宽度和高度。 2) 使用仅偶尔出现的组件的最佳策略是将其和空白面板放入CardLayout 中,如this answer 所示。
  • There i have an huge JPanel that contains a huge JFrame. - 不,您不这样做,因为您无法将 JFrame 添加到 JPanel。 That JFrame as 5 small JFrames, - 您不能将 JFrame 添加到 JFrame。因此,除了发布您的minimal reproducible example 之外,还要使用适当的术语提出适当的问题。此外,变量名称不应以大写字符开头。发布代码时遵循 Java 约定。

标签: java swing netbeans jpanel layout-manager


【解决方案1】:

看起来您正在使用 Java Swing,对吧?

如果您的 JPanel 包含 JFrame,那么您做错了什么。要构建正确的 UI,您必须在 JFrame 中添加 JPanel。

另外,要达到正确的组件顺序和放置,您需要配置相应的布局,here 是描述。

【讨论】:

  • Here 是如何在 SWING 上构建正确 UI 表示的示例。要实现面板之间的切换,您可以删除现有的面板并将新的面板添加到容器中,否则您可以使用.setVisible(false)而不是remove和其他.setVisible(true)来显示它。
【解决方案2】:

您可以一次加载一个 jframe 因为您添加的每个 jframe 都有自己的位置,并且可见性不会做任何删除 尝试保存每个 jframe 并进行更改 删除旧的并添加新的

【讨论】:

    【解决方案3】:

    为什么要使用多个 JFrame 来执行此操作?据我所知,最好使用 JPanel 来处理单个任务,例如菜单和按钮等。

    我自己对使用 javax.swing 比较陌生,但据我所知,每个窗口一次只能有 1 帧(就像其他人所说的那样)。

    根据我从您的项目中了解到的情况,您甚至可能不需要多个面板。您只需要一个带有按钮的菜单面板,以及根据按钮显示文本的多个标签或 JLabel。您可以在编写 addActionListener 时使用 setText 方法,如下所示:

        buttonName.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 labelName.setText("blah blah blah");
                 //and whatever else you may need to do
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-17
      • 2012-08-01
      • 2016-07-31
      • 2014-04-30
      • 2013-02-05
      • 1970-01-01
      • 2016-03-22
      相关资源
      最近更新 更多