0

次の ListCellRenderer は、ネストされた ComboBox でクリック イベントを受け取りません。何かを有効にする必要がありますか?

class FilterCellRenderer implements ListCellRenderer {

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Filter filter = (Filter)value;

        JPanel filterPanel = new JPanel();
        FlowLayout layout = new FlowLayout();
        layout.setAlignment(FlowLayout.LEFT);
        filterPanel.setLayout(layout);
        filterPanel.add(new JLabel(filter.getLabel()));

        final List<Object> options = filter.getOptions();
        if (options.size() > 1) {
            JComboBox optionCombo = new JComboBox(new AbstractComboBoxModel() {

                public int getSize() {
                    return options.size();
                }

                public Object getElementAt(int index) {
                    return options.get(index);
                }
            });
            optionCombo.setSelectedItem(filter.getValue());
            filterPanel.add(optionCombo);
        }

        if (isSelected) {
            filterPanel.setBackground(list.getSelectionBackground());
            filterPanel.setForeground(list.getSelectionForeground());
        } 
        return filterPanel;
    }

}
4

3 に答える 3

1

行を選択する必要がなかったので、カスタム レイアウトを使用して JPanel に要素を動的に追加するだけになりました。テーブルをハックすることなく、完全なコンポーネントの動作を許可します。

于 2008-10-11T00:06:32.573 に答える
1

Swing のレンダラー コンポーネントは「ゴム印」のように機能します。値をレンダリング/ペイントするためにのみ使用され、通常の方法で親コンテナーに追加されることはありません (1 つのコンポーネントを複数の場所に追加する方法を考えてみてください!)。

レンダラーではなくエディターが必要なようです (エディターは完全なコンポーネントであり、いつでも 1 か所に追加されます)。そうしないと、代わりに JList に MouseListener をインストールする必要があります。

于 2008-10-09T20:13:27.767 に答える
0

これは少し注意が必要です。JListを単一列のJTableに置き換える必要があると思います。次に、テーブルセルエディタとレンダラーを設定します。IIRC、最初のクリックを失う問題があるかもしれません(編集されたセルを選択するために使用されます)。

また、getCellRendererComponentを呼び出すたびにコンポーネントを再利用することをお勧めします。部品はスタンプとして使用され、廃棄されます。毎回再作成すると、パフォーマンスが大幅に低下します。

于 2008-10-09T18:27:55.123 に答える