【发布时间】:2016-04-30 16:09:28
【问题描述】:
我目前正在编写程序的一部分,将动态数量的 JComboBoxes 插入 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 窗格。在选项卡式窗格中,我正在创建这个“库存面板”以适应它。在库存面板中,有一个 JComboBoxes 的“网格”(行和列),其中数量是库存的大小。每个组合框都是可自动完成的(在键入时)以便于使用。
所以我创建了 Jpanel,将其设置为 MigLayout(使用调试进行可视化调试)。
有 4 列(我选择了这个数字) 行数取决于库存大小除以 4 列。简单的东西。
当然,我在 for 循环中使用 for 循环来创建我的 jcomboboxes XY 网格。这是它变得非常缓慢的地方。我不确定循环是否很慢(我怀疑,因为它是简单的算术)或者是否存在线程问题或什么..
WordUtils 是 Apache 的 Commons-Lang 库的一部分,AutoCompleteDecorator 用于 JComboBoxes 通过 SwingX 库自动完成。
GameItem 只是一个表示游戏项目的对象,其中包含一些小值(短裤、字节等。与此无关)。
我不知道如何让它更快。
【问题讨论】:
-
任何分析器都会告诉您比我们的假设更多的信息
-
This answer on SO 可能是您的问题。它与 JTabbedPane 和 MigLayout 一起使用。
-
@AdamSkywalker 问题是渲染了这么多摇摆物体,速度很慢......但我不知道另一种方法。
-
@lschuetze 我看到了,不幸的是它没有解决我的问题。
标签: java swing autocomplete swingx