11

我正在尝试再次进入Java(已经有几年了)。我从来没有真正在java中做过任何GUI编码。我一直在使用 Netbeans 开始使用它。

在工作中使用 C# 中的 winforms 时,我使用用户控件来构建我的 UI 的一部分并将它们动态添加到表单中。

我一直在尝试JPanels在 C# 中使用类似用户控件。我创建了一个JPanel名为BlurbEditor. 这有一些简单的控件。我试图在按钮事件的运行时将它添加到另一个面板。

这是我认为可行的代码:

mainPanel.add(new BlurbEditor());
mainPanel.revalidate();
//I've also tried all possible combinations of these too
//mainPanel.repaint();
//mainPanel.validate();

不幸的是,这不起作用。我究竟做错了什么?

4

6 回答 6

17

我想到了。此处接受的答案下的评论对此进行了解释: 动态添加的 JTable 未显示

基本上我只是在 mainPanel.add() 之前添加了以下内容

mainPanel.setLayout(new java.awt.BorderLayout());
于 2008-10-04T06:13:53.517 回答
5

Swing/AWT组件通常必须在向它们添加内容之前具有布局 - 否则UI将不知道将子组件放置在哪里。

BFreeman 提出BorderLayout了最容易使用的方法之一,它允许您将东西“粘合”到父对象的顶部、底部、左侧、右侧或中心。

还有其他的,例如FlowLayoutwhich 就像 a textarea- 它在父级的顶部从左到右添加组件,并在到达末尾时换行到新行。

GridBagLayout一直以无法弄清楚而臭名昭著,但确实为您提供了几乎所有所需的控制权。有点像HTML我们过去看到的那些表格,它们具有行跨度、跨度、宽度和高度属性的奇怪组合——看起来从来没有像你想要的那样。

于 2008-10-04T11:02:31.203 回答
0

与所有 Swing 代码一样,不要忘记在事件调度线程中调用任何 gui 更新。看到这个为什么你必须做这样的更新

// Do long running calculations and other stuff outside the event dispatch thread
while (! finished )
  calculate();
SwingUtilities.invokeLater(new Runnable(){
  public void run() {
    // update gui here
  }
}
于 2008-10-04T09:16:37.907 回答
0

mainPanel.add(new BlurbEditor());

mainPanel.validate();

mainPanel.repaint();

于 2010-10-22T05:22:05.537 回答
0

我正在处理类似的问题,我想在运行时更改面板中包含的面板
经过一些测试、重新测试和很多失败,我的伪算法是这样的:

parentPanel : 包含我们要移除的面板
childPanel : 我们要切换的面板
parentPanelLayout : parentPanel 的布局
editParentLayout() : 每次使用不同的 childPanel 和 NEW parentPanelLayout 构建 parentPanel

parentPanel.remove(childPanel); 
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();
于 2013-10-26T08:03:48.390 回答
-1

尝试mainPanel.invalidate(),然后如果需要,mainPanel.validate(). 还可能值得检查您是否在事件调度线程中执行所有这些操作,否则您的结果将参差不齐且(通常)不确定。

于 2008-10-04T05:35:13.563 回答