[英]Java JComboBox Custom Renderer and GTK
我有一個需要從JComboBox中選擇的Customer
對象的列表。 從我閱讀的內容中,我需要實現一個自定義渲染器,以使我想要的字段顯示在列表中。
我希望我的JComboBox的條目格式如下:
+----------------------------------------------+
| Customer Name - Contact - City, State V |
+==============================================+
| Customer #2 Name - Contact - City, State |
| Customer #3 Name - Contact - City, State |
| Customer #4 Name - Contact - City, State |
| Customer #5 Name - Contact - City, State |
+----------------------------------------------+
我使用以下代碼:
公共類CustomerListCellRenderer擴展DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof Customer) {
Customer c = (Customer) value;
StringBuffer sb = new StringBuffer();
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getCompany());
}
sb.append(" - ");
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getContact());
}
sb.append(" - ");
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getCity());
sb.append(", ");
}
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getState());
}
setText(sb.toString());
}
return this;
}
}
在使用系統GTKLookAndFeel的Solaris / Unix / Linux下,此方法無法正常工作。 組合框的輸入區域的背景未繪制,並且在其周圍未繪制邊框。 (請參見下面的屏幕截圖)。 還有另一種方法可以在3個主要平台(Win / Mac / GTK)上正常工作嗎? 我可以做一個轉換器來做到這一點,只操作數據而不是GUI嗎?
我當前的解決方法是重寫Customer對象上的toString()以所需的格式顯示每條記錄,但是正在尋找其他想法。
缺口
同樣的問題,我這樣做是為了自定義它以顯示圖標:
private static class CustomComboBoxRenderer extends DefaultListCellRenderer
{
private final ListCellRenderer backend;
public CustomComboBoxRenderer(ListCellRenderer backend)
{
this.backend = backend;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
Component component = backend.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(component instanceof JLabel == false)
component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
JLabel label = (JLabel)component;
label.setIcon(Icons.COMPONENT);
return label;
}
}
然后像這樣分配渲染器:
comboBox.setRenderer(new CustomComboBoxRenderer(comboBox.getRenderer()));
到目前為止,這對我來說還算不錯。
嘗試這個:
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Customer) {
Customer c = (Customer) value;
StringBuffer sb = new StringBuffer();
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getCompany());
}
sb.append(" - ");
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getContact());
}
sb.append(" - ");
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getCity());
sb.append(", ");
}
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getState());
}
value = sb.toString();
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
還請使用StringBuilder而不是StringBuffer(這是單線程情況)。
同樣,例如,您似乎在代碼中剪切並粘貼了錯誤:
if (c.getCompany() != null && c.getCompany().length() > 0) {
sb.append(c.getState());
}
正在檢查公司成員並使用州成員。
DefaultListCellRenderer
擴展了JLabel,看起來像JLabel。 如果您具有不可編輯的ComboBox,則通過getRenderer返回的Renderer將用於繪畫下拉列表區域以及“輸入”區域。 嘗試使用ComboBox和渲染器的邊框/前景/背景設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.