gpt4 book ai didi

java - 修复 JScrollPane 的高度

转载 作者:行者123 更新时间:2023-11-30 07:57:01 26 4
gpt4 key购买 nike

我不知道我面临的问题是否只针对我的情况,所以我写了一个精简版的问题原因(使用 JLabels 作为示例组件) .

public class InterestingBehavior {

static int direction = -4;
static final boolean useScroll = true;
static final String longString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

public static void main(String[] args) {
JFrame test = new JFrame("Test");
test.setSize(500, 300);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

test.setLayout(new BoxLayout(test.getContentPane(), BoxLayout.Y_AXIS));
for (int i = 0; i < 10; i++)
test.add(useScroll ? new JScrollPane(new JLabel(longString)) : new JLabel(longString));
test.add(Box.createVerticalGlue()); //should use all available space

final int min = 300, max = 600;
new Timer(50, e -> {
int h = test.getHeight();
SwingUtilities.invokeLater(() -> test.setSize(test.getWidth(), h + direction));
direction = h == min || h == max ? -direction : direction;
}).start();

test.setVisible(true);
}

}

框架会自行调整大小以显示我想要/不想要的内容。将 JLabel 添加到 BoxLayout 使它们都位于 JFrame 的顶部 - 这就是我想要的,因为我在控制板。但是,如果我将 JLabel 包装在 JScrollPane 中,它会决定根据 JFrame 的高度自动垂直调整自身大小 - 我该如何避免这种行为并将滚动 Pane 保持在恒定高度?

框架:

expanded scroll pane

调整大小后,变为

small pane

这不是我想要的。

如何将一个维度固定为子组件(视口(viewport))的维度?

最佳答案

问题是 JScrollPane 本身占用了它获得的所有空间。 BoxLayout 公平地分配 JScrollPanes 和垂直胶之间的可用空间。

解决方案是限制 JScrollPanel 要求的垂直空间,例如使用jScrollPane.setMaxmimumSize(新维度(1000, 50))

现在,您让每个 ScrollPane 都恰好捕获了这个空间,这会导致在调整大小时出现奇怪的行为并且实际上需要绘制水平滚动条。因此,您可能想要一个首选尺寸,例如jScrollPane.setPreferredSize(new Dimension(0, 50))也是。

这里是完整的例子:

    static int direction = -4;
static final boolean useScroll = true;
static final String longString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

public static void main(String[] args) {
JFrame test = new JFrame("Test");
test.setSize(500, 300);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

test.setLayout(new BoxLayout(test.getContentPane(), BoxLayout.Y_AXIS));
for (int i = 0; i < 10; i++) {
if(useScroll) {
JScrollPane jScrollPane = new JScrollPane(new JLabel(longString));
jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setMaximumSize(new Dimension(1000, 50));
jScrollPane.setPreferredSize(new Dimension(0, 50));
test.add(jScrollPane);
} else {
test.add(new JLabel(longString));
}
}
test.add(Box.createVerticalGlue()); //should use all available space

final int min = 300, max = 600;
new Timer(50, e -> {
int h = test.getHeight();
SwingUtilities.invokeLater(() -> test.setSize(test.getWidth(), h + direction));
direction = h == min || h == max ? -direction : direction;
}).start();

test.setVisible(true);
}

关于java - 修复 JScrollPane 的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41629778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com