我目前正在編寫我的程序的一部分,它將動態數量的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對象正在呈現,它非常緩慢......但我不知道另一種方式來做到這一點。 –