使用 JScrollPane 时容器宽度不可靠
Unreliable Container width when using JScrollPane
我制作了一个自定义 LayoutManager 以在 space 提供的统一正方形中呈现组件,它使用以下方法实现:
@Override
public void layoutContainer(Container parent) {
if(parent.getWidth() == 0) {
return;
}
int columns = parent.getWidth() / gridSizeWidth;
int x = 0, y = 0;
for(int i = 0; i < parent.getComponentCount(); i++) {
Component comp = parent.getComponent(i);
comp.setBounds(x * gridSizeWidth, y * gridSizeHeight, gridSizeWidth, gridSizeHeight);
if(++x == columns) {
x = 0;
y++;
}
}
System.out.println(parent.getClass().getSimpleName() + ": " + parent.getWidth());
}
这段代码在直接应用于 JFrame 时可以正常工作,但如果我尝试将它插入 JScrollPane 中,它很快就会崩溃。
仅添加到 JFrame 且看起来正确时,控制台显示:
TileScroller: 422
但是,将其添加到 JScrollPane 时...
TileScroller: 419
TileScroller: 26816
TileScroller: 1716224
TileScroller: 109838336
TileScroller: 419
TileScroller: 26816
TileScroller: 1716224
TileScroller: 109838336
TileScroller: 419
...
它会非常快速地重复此操作,并且会因如此快速地更改布局而导致闪烁效果。据我所知,它正确地将每个组件放置在每个尺寸的正确位置,但问题是尺寸在波动。
这是我创建 JScrollPane 的代码。
JPanel modeIndividualTile = new JPanel();
JScrollPane tileScroller = new JScrollPane(tileSelector = new TileScroller(creator),
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
tileScroller.getVerticalScrollBar().setUnitIncrement(8);
modeIndividualTile.add(tileScroller);
// Custom layout manager that renders everything relatively to the designated values below. (20,65) will render at x=20% of width, y=65% of height.
rl.addComponent(frame, tileScroller, 20, 65, 80, 98);
这可能是什么原因造成的,我该如何预防?
问题是因为 preferredLayoutSize 和 minimumLayoutSize 的实施不当。正确使用这些方法修复它。
我制作了一个自定义 LayoutManager 以在 space 提供的统一正方形中呈现组件,它使用以下方法实现:
@Override
public void layoutContainer(Container parent) {
if(parent.getWidth() == 0) {
return;
}
int columns = parent.getWidth() / gridSizeWidth;
int x = 0, y = 0;
for(int i = 0; i < parent.getComponentCount(); i++) {
Component comp = parent.getComponent(i);
comp.setBounds(x * gridSizeWidth, y * gridSizeHeight, gridSizeWidth, gridSizeHeight);
if(++x == columns) {
x = 0;
y++;
}
}
System.out.println(parent.getClass().getSimpleName() + ": " + parent.getWidth());
}
这段代码在直接应用于 JFrame 时可以正常工作,但如果我尝试将它插入 JScrollPane 中,它很快就会崩溃。
仅添加到 JFrame 且看起来正确时,控制台显示:
TileScroller: 422
但是,将其添加到 JScrollPane 时...
TileScroller: 419
TileScroller: 26816
TileScroller: 1716224
TileScroller: 109838336
TileScroller: 419
TileScroller: 26816
TileScroller: 1716224
TileScroller: 109838336
TileScroller: 419
...
它会非常快速地重复此操作,并且会因如此快速地更改布局而导致闪烁效果。据我所知,它正确地将每个组件放置在每个尺寸的正确位置,但问题是尺寸在波动。
这是我创建 JScrollPane 的代码。
JPanel modeIndividualTile = new JPanel();
JScrollPane tileScroller = new JScrollPane(tileSelector = new TileScroller(creator),
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
tileScroller.getVerticalScrollBar().setUnitIncrement(8);
modeIndividualTile.add(tileScroller);
// Custom layout manager that renders everything relatively to the designated values below. (20,65) will render at x=20% of width, y=65% of height.
rl.addComponent(frame, tileScroller, 20, 65, 80, 98);
这可能是什么原因造成的,我该如何预防?
问题是因为 preferredLayoutSize 和 minimumLayoutSize 的实施不当。正确使用这些方法修复它。