java - 使用 JScrollPane 时不可靠的容器宽度
问题描述
我制作了一个自定义 LayoutManager 以在提供的空间中以统一的正方形呈现组件,它通过使用以下方法来实现:
@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 的实施不当造成的。正确使用这些方法可以修复它。
推荐阅读
- networking - 支持 Kubernetes NodePort 服务的 SSL/TLS
- bash - 具有可能超时的多个卷曲的脚本
- angular - FormGroup 不是表单的已知属性
- php - 我在 Linux 中执行命令时遇到问题
- c++ - 引用您不拥有的“std::unique_ptr”(使用原始指针?)
- entity-framework - 无法将类型 'TestLinq.UserData' 转换为 T'estLinq.userData'
- json - MissingRefError - 使用 $ref 的 json 架构远程 REST Web 服务枚举无法解析对远程 json 的引用
- aiml - 使用
和 在目标 - java - Spring 中的 404 错误(java config / no web.xml)
- java - 如何使用 Java 飞碟将现有 PDF 附加到生成的 PDF