0

カスタム ListCellRenderer を作成しました。

import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

/**
 *
 * @author Spencer
 */
public class TaskRenderer implements ListCellRenderer {

    private Task task;

    private JPanel panel = new JPanel();
    private JCheckBox checkbox = new JCheckBox();
    private JLabel label = new JLabel();

    public TaskRenderer() {
        panel.add(checkbox);
        panel.add(label);
    }

    public Component getListCellRendererComponent(
            JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
        task = (Task) value;
        label.setText(task.getName());
        return panel;
    }

}

上記のクラスを使用してレンダリングされた各セルを含む JList を用意しますが、各セルのパネルのチェックボックスはクリックできません。ピントが合わなかったのが原因かと思いました。何か案は?

ありがとう、スペンサー

4

2 に答える 2

2

カスタム レンダラーは、コンポーネント (チェック ボックス) を変更する機能などの機能を追加するのではなく、単に JList コンテンツの外観を制御するだけです。各リスト セルを順番に表示するために使用される単純なゴム印と想像してください。

次の方法で問題を解決することをお勧めします。

  1. JList の代わりに単一列の JTable を使用します。
  2. AbstractTableModel をサブクラス化することで特注の TableModel 実装を定義し、getColumnClass(int) をオーバーライドして列 0 の Boolean.class を返します。デフォルトのレンダラーはこれを JCheckBox としてレンダリングすることに注意してください。ただし、必要に応じてラベル付けされた JCheckBox にはなりません。
  3. Boolean 用に特注の TableCellRenderer を追加します。例 myTable.setCellRenderer(Boolean.class, new MyLabelledCheckBoxRenderer());
  4. myTable.setCellEditor(Boolean.class, new DefaultEditor(new JCheckBox("Is Enabled)));
于 2010-05-14T10:25:42.057 に答える
0

JIDE Common Layerには GPL 化されたCheckBoxListがあります。基本的に、JPanel をセル レンダラーとして使用し、別のレンダラー (自分で設定できます) の前に JCheckBox を配置し、マウス/キー イベントを処理します。

本当に JCheckBox レンダラーに固執したい場合は、マウス/キー イベントをリッスンして適切に処理できます。Adamski が指摘したように、セル レンダラーはゴム印 (Swing 101) であるため、常にチェック ボックスを選択状態に設定する必要があることに注意してgetListCellRendererComponent()ください。そうしないと、すべてのチェックボックスが保存状態になります。

于 2010-05-28T17:15:57.673 に答える