我目前正在编写我的程序的一部分,它将动态数量的JComboBoxes插入到JPanel中,但是我注意到它非常慢(需要约10秒才能完成),并且它冻结了整个Swing线程以执行它。我不知道有什么更好的解决方案,但我知道有一个更好的方法。为什么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窗格。在标签窗格中,我正在创建这个“库存面板”以适应它。在清单面板中,JComboBoxes有一个“网格”(第&列),其中金额是清单的大小。每个组合框都可以自动完成(打字时)以方便使用。
因此,我创建Jpanel,将其设置为MigLayout(使用调试进行可视化调试)。
有4列(我选择了这个数字) 行的数量取决于库存的大小除以4列。简单的东西。
然后当然我在for循环中使用了for循环来允许我创建jcomboboxes的XY网格。这是它真的很慢的地方。我不确定循环是否缓慢(我怀疑,因为它是简单的算术),或者如果存在线程问题或者是什么......
WordUtils是Apache的Commons-Lang库的一部分,AutoCompleteDecorator用于JComboBoxes通过SwingX库自动完成。游戏项目只是一个表示游戏项目的对象,其中有一些小的值(短裤,字节等等)。
我对如何加快速度感到难以置信。
任何分析器会告诉你比我们的假设更多 – AdamSkywalker
[This SO on SO](http://stackoverflow.com/a/27187624/3676217)可能是你的问题。这是与JTabbedPane和MigLayout。 – lschuetze
@AdamSkywalker问题是如此多的swing对象正在呈现,它非常缓慢......但我不知道另一种方式来做到这一点。 –