【问题标题】:Swing components overlapping when content in changed内容更改时摆动组件重叠
【发布时间】:2014-02-28 21:37:01
【问题描述】:

当事件将更改组件的内容时,我遇到了问题,例如更改 JLabel 的名称、从 Jpanel 中删除按钮然后添加另一个组件。

这是我最初的 JFrame。

这是每次发生事件时组件重叠时我的 JFrame 的外观。

我正在使用这段代码来临时解决我的问题,但是仅仅调整大小当然不是一个好主意。

setSize(panelWidth + 1, panelHeight + 1);
setSize(panelWidth, panelHeight);

我想知道是什么导致了这个问题,我该如何解决这个问题?

注意:我正在使用布局管理器。带有按钮的面板使用网格布局,而其他大多数面板都使用网格包布局。

更新:删除setOpaque(true) 修复顶部面板上的重叠。剩下的是带有按钮的面板。我使用的 GridLayout 只有 1 列。

这是我在pnlButtons 处显示按钮的一些代码。

    private void initializeShoppingModeButtons() {
    pnlButtons.removeAll();
    pnlButtons.add(btnSearchProduct);
    pnlButtons.add(btnManualInput);
    pnlButtons.add(btnCheckOut);
}

private void initializeProductMenuButtons() {
    pnlButtons.removeAll();
    pnlButtons.add(btnSearchProduct);
    pnlButtons.add(btnViewIndividual);
    pnlButtons.add(btnAlternative);
    pnlButtons.add(btnDisplayInfo);
    pnlButtons.add(btnCancel);
}

【问题讨论】:

  • 你是用LayoutManager还是给null Layout添加组件?
  • 当组件不遵守不透明约定时,可能会发生这种问题。
  • 是的,我正在使用布局管理器。
  • 没有一些代码几乎不可能分辨出来。
  • pnlButtons.removeAll();然后 pnlButtons.revalidate() 和 repaint() 必须作为最后的代码行调用,在对可见 Swing GUI 的所有更改完成后

标签: java swing user-interface


【解决方案1】:

一个可能的问题是非常简单的代码被剪断

private void initializeProductMenuButtons() {
    pnlButtons.removeAll();
    pnlButtons.add(btnSearchProduct);
    pnlButtons.add(btnViewIndividual);
    pnlButtons.add(btnAlternative);
    pnlButtons.add(btnDisplayInfo);
    pnlButtons.add(btnCancel);
}

应该是

private void initializeProductMenuButtons() {
    pnlButtons.removeAll();
    pnlButtons.add(btnSearchProduct);
    pnlButtons.add(btnViewIndividual);
    pnlButtons.add(btnAlternative);
    pnlButtons.add(btnDisplayInfo);
    pnlButtons.add(btnCancel);
    pnlButtons.revalidate();
    pnlButtons.repaint();
}
  • Swings API 没有通知容器内容发生变化

    1. 例如JComponents 被删除,删除和添加,某些类型的重新布局(更改顺序,e.i.)

    2. revalidate();repaint(); 将通知已使用的 LayoutManager,在对 Swing GUI 的所有更改完成后,将其用作最后的代码行

  • 没有你的SSCCEMCVE/MCTRE,什么都没有

编辑第一个。

【讨论】:

  • +1 :) 请考虑添加有关此行的评论:setSize(panelWidth + 1, panelHeight + 1);。开发人员永远不应计算任何宽度/高度,因为此任务由布局管理器完成。
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2016-04-26
相关资源
最近更新 更多