java - 为什么 Swing 花了这么长时间来创建这个面板?

标签 java swing autocomplete swingx

我目前正在编写程序的一部分,将动态数量的 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/

相关文章:

java - 如何在 Java 中旋转 imageIcon

java - 从不同的类获取数据而不用在java中重新打开JFrame?

php - 如何为 jquery 自动完成制作 json 代码?

java - Swing JPanel - 绘制的图形复制而不是移动

java - JToolBar 等价于frame.setJMenuBar(ie.createMenuBar()); 的是什么?

javascript - 如何为 jquery 自动完成框设置默认值?

javascript - jQuery 自动完成与 java 自定义数据并显示存储值

java - 使用 Spring 的 HandlerInterceptor 发送错误会导致 406( Not Acceptable )响应

java - 将独立jar导入本地maven存储库

java - 返回java字符串而不是返回null