2011-03-07 41 views
1

我試圖製作一個多列JComboBox。我環顧四周,這似乎是一件非常棘手的事情。除非有很多人,否則我不想擁有一個表格(在其中選擇一行):我需要消除JComboBox中的滾動條,爲了達到這個目的,我想將它的項目放在多列列表中,而不是隻將它們放在一列中。如何將另一個LayoutManager應用於JComboBox? (多列JComboBox嘗試)

我最好的選擇,到目前爲止是這樣做:

JComboBox dropdown = new JComboBox(validValues); 
CellRendererPane crp = (CellRendererPane) dropdown.getComponent(1); 
crp.setLayout(new GridLayout(4, 4)); // for 16 items... 

但它不工作。它仍然在單個列中放置單元格。我在設置LayoutManager之後嘗試添加項目,但它不影響結果。

任何人都有關於如何實現這一目標的線索?

到目前爲止,我已經看到ListCellRenderer是無用的。它只規定了如何繪製一個單元格(一次一個),而不是如何繪製所有單元格(它們彼此的相對位置是什麼)。

歡迎任何幫助!

謝謝!

MJ

回答

2

組合框使用JList在彈出窗口中呈現項目。默認情況下,每個項目都顯示在一行中。您可以訪問此列表直接使用:

Object child = comboBox.getAccessibleContext().getAccessibleChild(0); 
BasicComboPopup popup = (BasicComboPopup)child; 
JList list = popup.getList(); 

現在你已經接取到列表中,你應該能夠通過更改默認顯示:

list.setLayoutOrientation(JList.HORIZONTAL_WRAP); 

希望的項目,現在將包裹時,達到下拉菜單的寬度。下拉的寬度由組合框的寬度來控制,所以你可能需要通過使用組合框的寬度玩:

list.setPrototypeDisplayValue(....); 

編輯:

其實,忘記使用setPrototypeDisplayValue( ...),我認爲你需要手動設置彈出窗口的大小。

默認情況下,彈出窗口的寬度總是等於組合框的寬度。您可以通過使用PopupMenuListener來覆蓋彈出窗口的大小來修改此行爲。爲了讓你開始,你可以看看Combo Box Popup條目。你的代碼會簡單得多,因爲你所需要做的就是硬編碼你想要的彈出窗口的寬度。

+0

謝謝!幾乎所有的工作......直到細胞原型線。我設法有一個巨大的彈出窗口,一個巨大的JList,但JScrollPane(JList所在的)仍然是JComboBox的寬度。我設置的單元格原型(looong JLabel)僅影響單元格的大小(可能是JList;我看到單元格大得多),但不是JScrollPane的寬度(或者是因爲JViewport?)。任何想法? – Joanis 2011-03-07 23:56:37

+0

@ M.Joanis,見上面的編輯。 – camickr 2011-03-08 04:29:31