2011-07-18 37 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