JSplitPane和Canvas

Mic*_*rry 2 java swing canvas awt jsplitpane

作为我写的应用程序的一部分,我需要将旧的(重量级)Canvas与swing组件混合 - 特别是将它们嵌套在JSplitPane中.但是,当我这样做时,分隔符拒绝在任何地方调整大小,好像两个画布都不会接受缩小尺寸.因此,证明该问题的代码如下:

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);
Run Code Online (Sandbox Code Playgroud)

我最初认为这是一个很容易解决的问题,但是在做了一些研究后,选项似乎表现为:

  • 改为使用JPanel(并不总是一个选项,就像我使用vlcj直接渲染到画布上一样)
  • 插入可能在某些情况下有用的狡猾的黑客攻击

有没有更好的方法呢?或者它真的只是诉诸黑客的情况?我已经讨论了其他选项,例如,如果可用的替代SplitPane实现可行,但是没有重量级实现,如果轻量级实现避免问题,我会感到惊讶.

cam*_*ckr 6

JSplitPane使用组件的"最小大小"来确定组件在使用分隔符时是否可以收缩.

我之前从未使用过Canvas,但似乎最小尺寸始终默认为首选尺寸.

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

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

Canvas canvas = new Canvas();
canvas.setMinimumSize( new Dimension(50, 50) );
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, canvas, new Canvas());
Run Code Online (Sandbox Code Playgroud)

你将能够向左移动分隔线,但永远不会向右移动.