我有一個使用DefaultListModel的jList,並使用從列表中獲取的對象(上下文:對象是ABM系統中的一種代理)填充它。是否可以更改Java Swing jList中項目的名稱*顯示*
是否可以更改名稱顯示爲jList中的對象?我一直沒能找到任何東西...
我有一個使用DefaultListModel的jList,並使用從列表中獲取的對象(上下文:對象是ABM系統中的一種代理)填充它。是否可以更改Java Swing jList中項目的名稱*顯示*
是否可以更改名稱顯示爲jList中的對象?我一直沒能找到任何東西...
:
要在包裝概念擴大完成這個是通過使用一個ListCellRenderer。將ListCellRenderer(任何CellRenderer真的)想象爲用於在列表中繪製每個對象的橡皮圖章。傳入對象,設置組件,組件繪製對象,然後移動到下一個對象。 CellRenderer從來沒有任何狀態。
考慮這個例子:
// Extend DefaultListCellRenderer, takes care of most of the work for you
public class ExampleListCellRenderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
// I know DefaultListCellRenderer always returns a JLabel
// super setups up all the defaults
JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelect, cellHasFocus);
// "value" is whatever object you put into the list, you can use it however you want here
// I'm going to prefix the label text to demonstrate the point
label.setText("PRE:" + label.getText());
return label;
}
}
// Some time later...
JList list = new JList();
list.setCellRenderer(new ExampleListCellRenderer());
我認爲名稱是由這些對象的toString()
方法產生的。如果你能改變這一點,那是最簡單的。否則,一個快速解決方案就是在每個包圍JList的對象視圖的周圍包裝某種持有者對象,並且當您必須對其進行真實操作時,可以輕鬆地從中檢索包含的對象。如果你想看到(而不是任何的toString()吐出)的信息包含在對象本身,最直接的「搖擺」的方式來
class FooBarAgentHolder {
// Simple javabean stuff
private FooBarAgent agent;
public FooBarAgentHolder(FooBarAgent agent) { this.agent = agent; }
public FooBarAgent getAgent() { return agent; }
// Produce the name for human consumption
public String toString() {
return agent.getDescriptiveName(); // Or whatever...
}
// Convenience conversion function
public static DefaultListModel makeListModel(List<FooBarAgent> list) {
DefaultListModel result = new DefaultListModel();
for (FooBarAgent agent: list)
result.addElement(new FooBarAgentHolder(agent));
return result;
}
}
感謝您的及時回覆。我不想更改原始對象名稱,所以我猜這個選項是沒有問題的,除非有一些技巧我不知道。在你的第二個建議。你可以好好擴展它嗎?對此我完全天真。一個例子將是非常有用的... – blackace 2010-12-23 12:21:06
@blackace:試試看。它應該是足夠簡單的代碼,你可以看到它顯然是正確的。適應你的實際代碼(例如,改變`FooBarAgent`並在`toString`中做正確的事情)。 – 2010-12-23 12:52:52