【问题标题】:NetBeans form designer: Change layout after call to initComponentsNetBeans 表单设计器:调用 initComponents 后更改布局
【发布时间】:2011-01-12 02:04:46
【问题描述】:

我有一个扩展 javax.swing.JPanel 的类,它包含一个 JButton。我在 NetBeans 设计器 中创建了该类。因此,我有一个从类构造函数调用的initComponents() 函数。

我想要做的是当/如果调用一个函数时,我想添加第二个按钮,并更改两个按钮的布局。做简单:

public void addSecond() {
    javax.swing.JButton secondButton = new javax.swing.JButton();
    add(secondButton , java.awt.BorderLayout.CENTER);
}

不起作用,新按钮不显示。我也试过打电话给invalidate(),但没有运气。

  • 如何触发重新评估布局?
  • 如果多次调用该函数,我需要在布局/按钮的哪些部分调用 dispose()?还有什么我应该担心的清理工作吗?
  • 如果我不使用 NetBeans 设计器会更容易处理吗?

【问题讨论】:

    标签: java netbeans layout designer jpanel


    【解决方案1】:

    当您以更改布局的方式更改组件时,您需要通过调用revalidate() 再次触发布局管理器。您可以随时调用它。
    对于简单的布局,只需调用 repaint() 就足够了。

    实际上,除非您正在动态更改面板(即动态添加/删除组件),否则您应该使用 netbeans 设计器,因此所有 Swing 元素都在一个位置。

    -- 编辑--
    而且您只能将 一个 组件放入每个面板的 BorderLayout.CENTER 中。如果您将多个元素放在面板的同一位置,则绘制的内容没有明确定义,即它可能是其中一个元素(或两者)。

    【讨论】:

      【解决方案2】:

      在添加带有BorderLayout.CENTER 的按钮之前,您需要设置面板​​的布局。此外,您必须再次删除并添加第一个按钮,并在面板上调用revalidate() 方法。

      如下更改您的 addSecond() 方法,它应该可以工作。

      private void addSecond() {
          JButton secondButton = new JButton("Button - 2");
      
          this.setLayout(new BorderLayout());
          remove(firstButton);
          add(firstButton, BorderLayout.NORTH);
          add(secondButton, BorderLayout.CENTER);
      
          revalidate();
      }
      

      【讨论】:

      • 我不知道我必须完全重新创建布局实例,我将更改代码。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2012-06-20
      • 2021-05-23
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多