2

我有一个扩展类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 设计器,这会更容易处理吗?
4

2 回答 2

1

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

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

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

于 2010-02-02T10:15:31.387 回答
1

在添加带有 的按钮之前,您需要设置面板​​的布局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();
}
于 2010-02-02T10:17:18.250 回答