java - 是否有与 JFrame.pack() 等效的方法,仅在子组件小于其数据模型时才调整子组件的大小?

标签 java swing user-interface jframe

背景

我正在用 Java 构建一个系统,该系统使用描述组件类、布局和数据绑定(bind)的预定值树在运行时生成 GUI,其中每个非边缘节点是某个组件的名称,例如

gui
+-- txtDist
|   +-- class: "text"
|   +-- binding: "dx"
|   +-- xy: [0,0]
|   +-- wh: [1,1]
+-- txtTime
|   +-- class: "text"
|   +-- binding: "dt
|   +-- xy: [0,1]
|   +-- wh: [1,1]
+-- txtV
|   +-- class: "text"
|   +-- binding: "v"
|   +-- xy: [1,0]
|   +-- wh: [1,2]
+-- btnCalc
|   +-- class: "button"
|   +-- binding: "fnCalcV" //a function that assigns the quotient of dx and dt to v
|   +-- label: "Calc. Velocity"
|   +-- xy: [0,2]
|   +-- wh: [1,1]
+-- btnClear
|   +-- class: "button"
|   +-- binding: "fnClear" //a function which sets variables to 0
|   +-- label: "Clear"
|   +-- xy: [1,2]
|   +-- wh: [1,1]

其中绑定(bind)值是kdb+服务器上的变量名称。生成的 GUI 看起来像这样:

Runtime GUI

当系统收到树时,它会使用描述创建 GUI,但不会立即用数据填充组件。这是由于系统的设计允许它在服务器上更改组件的绑定(bind)变量时实时更新组件;当查询或更新服务器时,更新的变量通过 ServerSocket 发送并放置在更新队列中,然后在代表 kdb+ 的数据模型对象上调用 notifyObservers变量。这些组件根据绑定(bind)树值观察各自的模型,然后获得要显示的新数据。

问题

从树中渲染 GUI 后,将调用 JFrame.setVisible(true),并且所有组件都会向服务器发送查询以获取其数据。数据对象被一一发送回更新队列,随后通知观察者。

此时,框架很小,因为组件可见,但是是空的。目前,我在数据模型对象消耗每个更新消息后调用JFrame.pack(),这本身就是一种资源浪费,但它使得确保组件填充完毕后,它们都会正确显示。

但是

如果用户调整 Frame 大小使其变大,然后更新服务器上的数据,则当新数据添加到更新中时,会再次调用 JFrame.pack() 方法队列,因此帧的大小调整将被撤消。我想知道是否有一个相当于 pack() 的方法,它仅在当前大小不适合所有数据的情况下才适合框架。

最佳答案

通常,当您动态更新您使用的可见 GUI 上的组件时:

panel.add(...);
panel.revalidate();
panel.repaint();

但是,这不会调整框架大小以显示所有组件。

调用上述代码后,您可以在面板上调用getPreferredSize()getSize()。然后,如果首选宽度/高度小于实际宽度/高度,您可以在框架上手动调用 pack()

关于java - 是否有与 JFrame.pack() 等效的方法,仅在子组件小于其数据模型时才调整子组件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24739125/

相关文章:

user-interface - 为什么 MS Sql server 2008R2 中数据库用户的权限部分为空

java - Java 中用于获取 xml 元素的 XPath 表达式

java - 带有按钮和弹出窗口的一般帮助/建议

Java,JFrame : getWidth() returns 0

Python:Tkinter 仅在键盘中断后打开

javascript - 如何确保一次仅打开/展开 1 个面板?

java - 在作为父类添加到数组后调用特定于子的方法

java - Android Facebook 分享不显示在 facebook 墙上的描述

java - 如何在内存中嵌入 MariaDB4j 以替换 JUnit 测试中默认的 Spring DataSource?

java - 绘制带圆角的三角形