背景
我正在用 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 看起来像这样:
当系统收到树时,它会使用描述创建 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/