【问题标题】:How to resize components related to panel in swing?如何在摇摆中调整与面板相关的组件大小?
【发布时间】:2012-05-28 21:49:58
【问题描述】:

我想调整与其父级(面板)相关的子组件的大小。

我正在使用以下方法:

@Override
public Dimension getPreferredSize() {
Dimension d = getParent().getSize();
int w = d.width * wid / 100;
int h = d.height * he / 100;
//System.out.println("x"+w+"h"+h);
return new Dimension(w,h);
}

但这并不能解决我的问题。谁能告诉是否有另一种调整组件大小的方法?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 如果没有显示预期内容的 SSCCE,则无法以目前的形式回答此问题;投票结束。

标签: java swing resize


【解决方案1】:
  • 使用正确的LayoutManager,没有理由提供它

  • 如果你想以编程方式调整大小,通过拒绝 LayoutManager,那么你必须实现 ComponentListener 或 HierarchyListener

  • 在进行任何(上述)更改后,您必须调用 revalidate() 和 repaint()

  • 如果您想从任何 Listener 调整大小,请通过 Swing Timer 延迟调整大小(400-500 毫秒)事件,如果调整大小继续 Timer#restart() 以避免闪烁或冻结,

【讨论】:

    【解决方案2】:

    您可以在子组件上调用setPreferredSize(Dimension d)。如果您打包 JFrame,组件将尝试变为该大小。


    编辑:正如评论所说,最好避免setPreferredSize(Dimension d),但我已经使用过该方法。例如:一个带有 BorderLayout 的 JPanel,其中有 3 个 JPanel(自定义类)。如果 JPanel.WEST 和 SOUTH 面板(另一个是 CENTER),则其高度必须分别为 0.1 * 宽度或高度。我用过

    setPreferredSize(new Dimension(getPreferredSize().height, getPreferredSize().width * 0.1))
    

    效果很好。 Borderlayout 采用该值,并使面板更宽一些(我必须这样做,因为在任何内部 JPanel 中都没有其他 JComponents)。

    【讨论】:

    • 一般情况下,使用setPreferredSize()这种方式就是bad idea
    • WESTSOUTH 面板上调用pack() 应该会导致它们采用显示封闭组件所需的大小,每个组件都应该计算自己的首选大小。如果内容包含文本,这一点至关重要。
    • 我在编辑中提到 WEST、SOUTH 或 CENTER JPanel 中没有组件。我用它们来画画。
    • 啊,有道理;覆盖getPreferredSize() 以反映绘图的几何图形也是一种选择。编辑:我怀疑 OP 正在使用ChartPanel;这可能是与构造函数参数结合使用的有用方法。没有更多信息,我们都在猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2012-07-02
    • 2020-11-13
    • 2015-07-08
    相关资源
    最近更新 更多