2

こんにちは、ColorChooser というクラスがあります (net.java.dev.colorchooser.ColorChooser パッケージ内)。

これは、色の選択に使用されるカスタム コンポーネントです。私が望むのは、2 列目に ColorChoosers を含む JTable を表示することです。だから私は自分の TableCellRenderer を作成し、それは動作します:

@SuppressWarnings("serial")
class ColorChooserTableRenderer extends DefaultTableCellRenderer {

    public static List<ColorChooser> colors;

    public ColorChooserTableRenderer(int rows) {
        colors = new ArrayList<ColorChooser>(rows);
        for (int i = 0; i<rows ; i ++) {
            colors.add(new ColorChooser());
        }
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        return colors.get(row);
    }

}

これをテーブルに登録します:

JTable t = new JTable(5,3);
t.getColumn(t.getColumnName(1)).setCellRenderer(new ColorChooserTableRenderer(5));

表示は良好です。ColorChoosers の 1 つにマウスを合わせると、ColorChoosers のツール ヒントも表示されます。問題は、ColorChoosers が MouseEvents を受信しないことです。

通常、ColorChooser でマウスを押したままにすると、色を選択するために使用できるポップアップ ウィンドウが表示されます。JTable の場合、ColorChooser コンポーネントはマウス イベントを受け取りません。

解決策はありますか?

編集:質問はこれに簡単に変更できます:

実際に動作する 2 列目に JButton を含むテーブルの小さな例を教えてください。ほら、押せるボタン?

4

2 に答える 2

3

私は他の目的でテーブルセルレンダラーを使用しているので、これは漠然と馴染みがあるように聞こえます。

私の理解では、TableCellRendererはコンポーネントのレンダリングにのみ使用されます。コンポーネントは実際には各セルに存在しません。

したがって、おそらくマウスイベントをJTable自体からColorChooserに転送する必要があります。

編集:ps、私の質問を参照してください-カスタムテーブルセルレンダリングについても、列が同じロジックでレンダリングされる場合、列全体に対してコンポーネント自体のインスタンスが1つだけ必要です。TableCellRendererに永続的な状態を保存せず、代わりにTableModelに保存し、への呼び出しを処理するときにレンダリングの直前にその状態を使用しますgetTableCellRendererComponent()

于 2009-05-20T13:33:06.900 に答える
2

レンダラーは、画面上のコンポーネントのみをペイントし、インタラクションを許可しません。必要なのは、TableCellEditorも実装することです。AbstractCellEditorを継承して、作業を節約することをお勧めします。テーブルのJavaチュートリアルを確認してください。

例:

public class MyTableCellRenderer implements TableCellRenderer
{
    private JButton button = new JButton("Press Me");
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        return button;
    }
}

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor
{
    private JButton button;

    public MyTableCellEditor()
    {
        button = new JButton("Press Me");
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                System.out.println("buttonPressed");
            }
        });
    }
    public Object getCellEditorValue() {
        return null;
    }
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return button;
    }
}
于 2009-05-20T13:48:38.460 に答える