我有一个复杂的问题,我无法在任何地方找到答案。
这是一个例子:
public static void main(final String[] args) {
final JFrame frame = new JFrame("test");
final JPanel bigPane = new JPanel(new GridLayout(0, 1));
frame.setContentPane(new JScrollPane(bigPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));
bigPane.add(new JTextField("reterterter ertertrert erterter ert"));
bigPane.add(new JTextField(" ertertrert erterter ert"));
bigPane.add(new JTextField("reterterter ertertrert ert"));
bigPane.add(new JTextField("reterterter ertertrert erterter "));
frame.pack();
frame.setSize(frame.getSize().width/2, frame.getSize().height);
frame.setVisible(true);
}
在这里,文本字段显然被剪切了。更准确地说,bigPane 被剪切。但我希望调整文本字段的大小而不是剪切文本字段,这样我们仍然可以使用它们。
由于禁止出现水平滚动条,我希望布局忘记视图(bigPane)的首选宽度,并始终强制视图的宽度与视口的宽度相匹配。就像水平方向没有虚拟视口,只有垂直方向一样。
我找不到解决方案,甚至没有破解,谢谢,如果你能提供帮助。
Nico.
PS:看起来 ViewportLayout 的代码不包含任何相关代码
PS2:这是上述代码结果的上限http://www.nraynaud.com/kilombo/testLayout.png http://www.nraynaud.com/kilombo/testLayout.png请参阅右侧。
我认为“正确”的方法是使用 Scrollable 接口:
public class ScrollPaneWidthTrackingPanel extends JPanel implements Scrollable {
private static final long serialVersionUID = 1L;
public ScrollPaneWidthTrackingPanel(LayoutManager layoutManager) {
super(layoutManager);
}
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return Math.max(visibleRect.height * 9 / 10, 1);
}
public boolean getScrollableTracksViewportHeight() {
return false;
}
public boolean getScrollableTracksViewportWidth() {
return true;
}
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return Math.max(visibleRect.height / 10, 1);
}
}
然后你的两行代码必须更改为:
final ScrollPaneWidthTrackingPanel bigPane = new ScrollPaneWidthTrackingPanel(new GridLayout(0, 1));
frame.setContentPane(new JScrollPane(bigPane));
并且无论框架的大小如何,组件都应始终填充 JScrollPane 的整个宽度。此更改有一个副作用,即组件现在不会填充 JScrollPane 的高度。要解决此问题,请将以下代码添加到 getScrollableTracksViewportHeight 方法的顶部:
if (getParent() instanceof JViewport) {
JViewport viewport = (JViewport) getParent();
return component.getPreferredSize().height < viewport.getHeight();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)