0

コンボボックスのリストを展開すると、「1」、「2」、「3」などの項目が表示されますが、「1」と言ってコンボボックスを折りたたむと、「」ではなく「1」が表示されます。 1"。

ListDataListenerコンボボックスにaを追加してみましたcontentsChanged()box.getEditor().setItem(my_map.get("one"))、my_mapが「one」から「1」などへのマッピングを格納する場所に追加しました。

しかし、それは機能せず、理由はわかりません。contentsChanged()呼び出された後に、変更を上書きする何かが発生しますか?

何か案は?

4

1 に答える 1

2

1 つの方法は、コンテンツを変更せずに、ペイント中にポップアップ内にあるかどうかをチェックする適切なレンダラーを提供することです。

ここに画像の説明を入力

概念実証のコード スニペットは次のようになります。

JComboBox box = new JComboBox(new String[] { "One|1", "Two|2", "Three|3" });

box.setRenderer(new ListCellRenderer<String>() {

    private JList<? extends String> list;
    private final JLabel label = new JLabel() {
        @Override
        public void paintComponent(Graphics g) {
            // Check if parent's parent is the combobox or the dropdown
            int part = getParent().getParent() == list ? 0 : 1;
            label.setText(label.getText().split("\\|")[part]);
            super.paintComponent(g);
        }
    };

    @Override
    public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) {
        this.list = list;
        label.setText(value);
        label.setOpaque(true);
        if (isSelected) {
            label.setForeground(list.getSelectionForeground());
            label.setBackground(list.getSelectionBackground());
        } else {
            label.setForeground(list.getForeground());
            label.setBackground(list.getBackground());
        }
        return label;
    }
});

注: 上記の例は、すべての側面を正しく処理しているわけではありません (フォーカス ボーダーなど)。

于 2013-01-15T18:32:49.333 に答える