【问题标题】:Centering JPanel with GridBoxLayout is repeatedly adding the JPanel使用 GridBoxLayout 居中 JPanel 是重复添加 JPanel
【发布时间】:2014-09-22 04:34:42
【问题描述】:

经过大量研究后,我似乎找不到任何问题所在。我正在创建一个程序,用户可以在其中选择他们想要使用的选项卡 (JTabbedPane)。在该选项卡中,我有一个 JPanel,当用户选择该选项卡时,我将它添加到该选项卡中。

private void tabEventsStateChanged(javax.swing.event.ChangeEvent evt) {                                       
    if (tabEvents.getSelectedComponent().equals(tabAddEvent)) {
        JPanel jp = new AddEvent();
        tabAddEvent.setLayout(new GridBagLayout());
        tabAddEvent.add(jp);
        tabAddEvent.updateUI();
    }
    else if (tabEvents.getSelectedComponent().equals(tabEditEvent)) {
        JPanel jp = new EditEvent();
        tabEditEvent.setLayout(new GridBagLayout());
        tabEditEvent.add(jp);
        tabEditEvent.updateUI();
    }
else if (tabEvents.getSelectedComponent().equals(tabDeleteEvent)) {
        JPanel jp = new DeleteEvent();
        tabDeleteEvent.setLayout(new GridBagLayout());
        tabDeleteEvent.add(jp);
        tabDeleteEvent.updateUI();
    }
else {
    System.out.println("Error! Tab Not Selected!");
}
}

JPanels 完美居中。但是,我很沮丧地发现,当我在 tabAddEvent 之后单击 tabEditEvent(或 tabDeleteEvent)然后返回 tabAddEvent 时,JPanel 又被添加了。这会创建一个奇怪的 UI,其中我有 2 个相同的表单并排放置,不再位于中心...... tabEditEvent 和 tabDeleteEvent 也是如此。如果我单击任何选项卡 3 次,我将在容器中添加 3 个 JPanel,依此类推...

更新

这是我朋友程序的原始代码的一部分:

else if (tabEvents.getSelectedComponent().equals(tabEditEvent)) {
        JPanel jp = new EditEvent();
        tabEditEvent.setLayout(new BorderLayout());
        tabEditEvent.add(jp, BorderLayout.CENTER);
        tabEditEvent.updateUI();
    }

更新 2

为了解决这个问题,我已经对结果进行了截图,以便您可以看到我想要描述的内容。 https://www.dropbox.com/s/isj5iezwcak1bfn/Untitled-1.png
https://www.dropbox.com/s/rywe1e5hgx7c88x/Untitled-2.png

我尝试研究 CardLayout,但很遗憾,我无法理解它

【问题讨论】:

  • 我不太清楚你在做什么。通常,您会提前创建不同的面板,然后将每个面板作为其自己的选项卡添加到 tabbedPane 上。这一切都将在 GUI 显示之前完成。听起来您正在通过在用户单击选项卡时动态创建内容来重新发明轮子。你想完成什么?
  • 我已经创建了不同的面板。在示例代码中,我有 3 个不同的面板,每个面板都有自己的表单和代码(AddEvent()、EditEvent() 和 DeleteEvent())。该示例代码又位于另一个具有 JTabbedPane (tabEvents) 的文件 (JFrame) 中。我现在要做的是在 JTabbedPane 中为用户显示这些单独的面板。
  • 为了尽快获得更好的帮助,请发布一个 Minimal Complete Example 来演示问题,而不仅仅是一个代码 sn-p。
  • 这是文件中唯一的代码。我不确定如何证明这个问题。这实际上是从朋友的程序中复制的代码。他改用 BorderLayout,但这并没有使面板居中
  • 我更新了 BorderLayout sn-p。我真的不知道如何在另一个容器中显示不同的面板

标签: java swing netbeans jpanel center


【解决方案1】:

.

public void updateUI()
Resets the UI property with a value from the current look and feel.
Overrides:
updateUI in class JComponent
See Also:
JComponent.updateUI()

  1. 使用CardLayout 而不是添加/删除JComponents

  2. 调用代码行 tabDeleteEvent.revalidate();tabDeleteEvent.repaint(); 在您必须重复添加/删除 JComponents 的情况下完成对已经可见的 Swing GUI 的所有更改

【讨论】:

  • 重新验证和重新绘制不起作用。我不太热衷于学习使用 CardLayout atm,因为我有点急于完成这个 =/
  • 在这种情况下调用updateUI() 是完全不合适的。如果不进行更改,此debt 的利息将继续增加。
【解决方案2】:

我认为它重复的原因是您每次都添加新面板。将面板添加到类的构造函数中,然后在上面代码中的选项卡之间导航。

【讨论】:

  • 我不确定我理解您所说的导航是什么意思?
【解决方案3】:

一位朋友帮忙并告诉我使用布尔 if 语句来确定我是否已经添加了面板

if (tabEvents.getSelectedComponent().equals(tabAddEvent)) {
        JPanel jp = new AddEvent();
    if (initializedAdd == false) {
    tabAddEvent.setLayout(new GridBagLayout());
    tabAddEvent.add(jp);
    initializedAdd = true;
    }
    }

工作得很好!一旦这个项目完成,我会仔细研究所有的布局!

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多