0

カスタム レンダラーのコードは次のとおりです。

private class FacilityElement extends javax.swing.JLabel implements javax.swing.ListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if(isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        }
        else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        setFont(list.getFont());
        setText(" " + ((Facility) value).getName()); // The error is here
        setOpaque(true);

        return this;
    }

}

にアイテムがない場合を除いて、すべてが正常に機能しますDefaultComboBoxModel。この場合、の値でgetListCellRendererComponent呼び出され、代わりにオブジェクトが必要になるため、エラーが発生します。String""Facility

なぜこのように振る舞うのですか?

更新:エラーがキャストによるものであることは知っており、使用方法を知っていますinstance of。問題は、なぜこのように動作するのか(関数)です。要素がない場合、まったく呼び出されないと予想されますが、なぜそれが呼ばれるのですか?結局のところ、要素がない場合、それは何をフォーマットしますか。

更新:以下の受け入れられた回答を使用できます。そのように動作する理由については、リストに空の文字列が必要なためです。コンボボックスを初めて初期化するときにデフォルトで選択される空の文字列を知っています。

4

1 に答える 1

2
private class FacilityElement extends javax.swing.JLabel implements javax.swing.ListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if(isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        }
        else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        setFont(list.getFont());
        if (value instanceof Facility) { // Try this
            setText(" " + ((Facility) value).getName()); 
        }    
        setOpaque(true);

        return this;
    }

}
于 2013-07-10T14:37:34.350 に答える