作为我正在编写的应用程序的一部分,我需要将旧的(重量级)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);
我最初认为这是一个简单的事情来解决,然而做了相当多的研究后,选项似乎呈现自己:
- 使用JPanel代替(不总是一个选项,因为在我的情况下,我使用vlcj直接渲染到画布上)
- 插入可能在某些情况下工作的x狡猾的黑客
有更好的方法吗?或者这真的只是一个诉诸黑客手段的案例?我已经讨论过其他的选择,比如是否有一个可以替代的SplitPane实现,但是没有重量级的实现,如果有一个轻量级的实现可以避免这个问题,我会很惊讶。
JSplitPane使用组件的"最小尺寸"来确定组件在使用分隔符时是否可以收缩。
我以前从未使用过画布,但似乎最小大小总是默认为首选大小。
重写Canvas的getMinimumSize(…)方法,返回一个合理的最小值。
对于快速文本,您可以使用:
Canvas canvas = new Canvas();
canvas.setMinimumSize( new Dimension(50, 50) );
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, canvas, new Canvas());
可以向左移动分隔符,但不能向右移动