我目前正在编写程序的一部分,将动态数量的 JComboBox 插入到 JPanel 中,但是我注意到它非常慢(大约需要 10 秒才能完成),并且它将整个 Swing 线程卡住到做吧。我不确定有什么更好的解决方案,但我知道有更好的方法。
private JPanel createInventoryPanel(PlayerInventory inventory)
{
JPanel panel = new JPanel();
panel.setLayout(new MigLayout("debug"));
int columns = 4;
int rows = inventory.getSize() / 4;
int index = 0;
for (int i = 0; i < columns; i++)
{
for (int j = 0; j < rows; j++)
{
GameItem item = inventory.getItems().get(index);
JComboBox box = new JComboBox(itemNames);
box.setEditable(true);
AutoCompleteDecorator.decorate(box);
box.setSelectedItem(WordUtils.capitalizeFully(item.getName()) + " (0x" + HexUtil.shortToHexString(item.getValue()) + ")");
boolean shouldWrap = ((index + 1) % 4 == 0) && index != 0;
panel.add(box, "" + (shouldWrap ? "wrap" : ""));
itemBoxes.add(box);
index++;
}
}
return panel;
}
解释一下我的代码:
我有一个 JFrame 和一个 JTabbed Pane 。在选项卡式 Pane 中,我正在创建这个“库存面板”以适应它。在库存面板中,有一个 JComboBox 的“网格”(行和列),其中数量是库存的大小。每个组合框都可以自动完成(键入时),以便于使用。
因此,我创建了 Jpanel,将其设置为 MigLayout(使用 debug 进行可视化调试)。
有4列(我选择了这个数字) 行数取决于库存大小除以 4 列。简单的东西。
当然,我在 for 循环内使用 for 循环,以允许我创建 jcombobox 的 XY 网格。这就是它变得非常慢的地方。我不确定循环是否很慢(我对此表示怀疑,因为它是简单的算术)或者是否存在线程问题或什么......
WordUtils 是 Apache Commons-Lang 库的一部分,AutoCompleteDecorator 用于让 JComboBox 通过 SwingX 库自动完成。
GameItem 只是一个表示游戏项目的对象,其中包含一些小值(shorts、字节等……与此无关)。
我对如何使其更快感到困惑。
最佳答案
我认为这是因为你同时创造了太多东西。我认为 JComboBox
渲染起来非常复杂。
但是,这不能在另一个线程上完成,因为您正在创建 UI 组件,而这必须在 UI 线程(主线程)上完成。
我也遇到过这种情况。但那是在我创建 Windows 窗体应用程序时,这是一种完全不同的技术。但我认为基本思想是一样的。
我想向 Panel
添加 100 个 UI 组件(类似于 JPanel
)。而且花了很长很长的时间。因此,我决定在顶部显示另一个 Panel
来覆盖 Panel
(我正在向其中添加内容的面板)。然后我在盖板上贴了一个标签,上面写着“正在加载”。这样,人们就会知道它正在加载并且不会 panic 。当然,生成组件后我隐藏了盖板
令人惊讶的是,当我运行该程序时,封面面板只出现了一小会儿!当它消失后,我发现我想要生成的东西都已经生成了!
所以我得出一个结论,UI组件如果不需要渲染的话,会出现得更快。
你也许应该做类似的事情。生成组合框时,将 JPanel
放置在另一个 JPanel 之上。完成后,再次隐藏面板,或将其完全删除。
关于java - 为什么 Swing 花了这么长时间来创建这个面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34974149/