2011-07-18 33 views
2

作为我正在编写的应用程序的一部分,我需要将旧的(重量级)Canvas与摆动组件混合使用 - 特别是将它们嵌套在JSplitPane中。但是,当我这样做时,分隔线拒绝在任何地方调整大小,就好像两个画布都不会缩小尺寸。证明了问题的代码是这样的:JSplitPane和Canvas

JFrame frame = new JFrame(); 
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new Canvas(), new Canvas()); 
pane.setResizeWeight(0.5); 
frame.add(pane); 
frame.pack(); 
frame.setVisible(true); 

我最初以为这是解决一个简单的事情,但是这样做的研究公平一点后,选择似乎标榜自己:

  • 使用JPanel的,而不是(并不总是一种选择,因为在我的情况下我使用vlcj来直接呈现到画布上)
  • 插入X狡猾的黑客可能会在某些情况下工作

有没有更好的方法来做到这一点?或者这只是一个诉诸黑客的案例?我讨论过其他的选择,例如是否有其他的SplitPane实现可用,但没有重量级的实现,如果轻量级实现可以避免这个问题,我会感到惊讶。

+0

您使用的是哪个版本的Java?一些重量轻的部件比其他部件的混合效果更好。 –

+0

@Hovercraft Full of Eels - 同时使用最新的Java 6和Java 7 RC进行测试 - 都给出了相同的结果。 – berry120

回答

6

JSplitPane使用组件的“最小大小”来确定组件在使用分隔符时是否可以缩小。

我以前从未使用过Canvas,但它看起来最小尺寸始终默认为首选尺寸。

覆盖Canvas的getMinimumSize(...)大小方法以返回合理的最小值。

对于快速文本,你可以使用:

Canvas canvas = new Canvas(); 
canvas.setMinimumSize(new Dimension(50, 50)); 
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, canvas, new Canvas()); 

,你将能够向左移动护栏,但从来没有回到正确的。

+0

非常感谢这个答案 - 它完美的工作,我仍然很惊讶它竟然是那么简单! – berry120