簡體   English   中英

Java JComboBox自定義渲染器和GTK

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM