1

jTableブール値の列がある場所で、Glazedリストを使用しています。デフォルトでjTableは、列がタイプのチェックボックスがレンダリングされますBoolean.Class。艶をかけられたリストを使用すると、必要なチェックボックスを取得できません。チェックボックスを拡張してレンダリングDefaultTableCellRendererしましたが、チェックボックスが「クリック可能」ではないため、満足できません。

GLのよくある質問http://www.glazedlists.com/documentation/faqで私は見つけました:

* Q:ブールテーブルセルをチェックボックスでレンダリングするように指定するにはどうすればよいですか?何らかの理由で、Glazed ListsにはgetColumnClass()メソッドがありません。

A:列クラスを指定する必要がある場合は、通常のTableFormatクラスの代わりにAdvancedTableFormatインターフェイスを実装する必要があります。GlazedLists.tableFormat()ファクトリメソッドを使用している場合は、AdvancedTableFormat.getColumnClass()メソッドを適切に実装するためにベースオブジェクトのクラスを指定する必要があります。*

これを経験したことがありますか?例とのリンクは見つかりませんでした。よくある質問の重要なリンクが壊れています。

私はこれで試しました:

 public class CheckBoxTableModel implements  AdvancedTableFormat {

     public Class getColumnClass(int column) {
         if(column==4)
        return Boolean.class;
         else
             return Object.class;
    }
}

助けてください!

編集:私はこれで試しました、jtableのフォームは表示されません

   private class TicketTableFormat implements AdvancedTableFormat<Ticket>  {

        private final String[] cols = new String[]{"Id", "From", "Subject", "Date", "Incomplete"};

        public int getColumnCount() {
            return cols.length;
        }

        public String getColumnName(int colId) {
            return cols[colId];
        }

        public Class getColumnClass(int col) {
            if (col == 4) {
                return Boolean.class;
            } else {
                return Object.class;
            }
        }


        public Object getColumnValue(Ticket ticket, int colId) {

            switch (colId) {
                case 0:
                    return ticket.getId();
                case 1:
                    return ticket.getFrom();
                case 2:
                    return ticket.getSubject();
                case 3:
                    return ticket.getDate();
                case 4:
                    return ticket.getIncomplete();
            }
            return null;
        }

        public boolean isEditable(Ticket e, int col) {
            if (col < 4) {
                return false;
            } else {
                return true;
            }
        }

        public Ticket setColumnValue(Ticket e, Object o, int i) {
            e.setB((Boolean) editedValue);
            return e;           
           }

        public Comparator getColumnComparator(int i) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

    }

私はこれでそれを呼びます:

 TicketTableFormat tbFormat = new TicketTableFormat();
 TicketsModel = new EventTableModel(textFilteredTickets, tbFormat);
 ticketTable.setModel(TicketsModel);
4

2 に答える 2

2

ここでの基本的なポイントは、テーブルセルのレンダリングとそれらの取得は2つの異なるものであるということです。テーブルセルレンダリングの場合、レンダラーは「スタンプ」としてのみ機能します。つまり、チェックボックスはレンダリングする必要のある状態に初期化され、その後、テーブルはレンダラーの写真のみを取得し(paintメソッドを呼び出すことにより)、tat画像を配置します。適切なセル内-すべてのセルをレンダリングするために、チェックボックスの同じインスタンスが何度も再構成され、対応するセル値を表します。コードで行ったことは、モデルのデータ型フレーバーを指定することです。これにより、テーブルによって選択されるデフォルトのテーブルセルレンダラーがチェックボックスレンダラーになります。

チェックボックスを編集可能にするには、セルエディタをテーブルセルにアタッチする必要があります(たとえば、特定の列のエディタを設定することによって)。テーブルセルが入力フォーカスを受け取ると、テーブルセルエディタコンポーネントが初期化され、テーブルセル内(つまり、以前にレンダラーによってペイントされたイメージの上)に配置されます。このセルエディタコンポーネント(この場合はチェックボックスになります)は、ユーザーがその特定のテーブル呼び出しから離れるまで、そこに残ります(マウスまたはキーボードを介したユーザー入力を受け入れます)。編集が終了すると、セルエディタは編集プロセスからキャプチャした値を要求され(つまりgetCellEditorValue()、エディタで呼び出されます)、値がテーブルによって取得され、そのセルのテーブルモデルに書き戻されます。

つまり、レンダラーはセルにデータをスタンプするだけです。つまり、出力します。入力を受け取るには、エディターコンポーネントが必要です。

于 2011-04-21T05:02:48.340 に答える
1

AdvancedTableFormatの実装にisEditable(...)とsetColumnValue(...)を実装しましたか?

次のメソッドを実装することは私にとってはうまくいきます。

public int getColumnCount()
public String getColumnName(int column)
public Object getColumnValue(E model, int column)
public boolean isEditable(E model, int column) // For making the checkbox editable
public IFdsModel setColumnValue(E model, Object value, int column)
public Class getColumnClass(int column) // For making it a Checkbox
public Comparator<E> getColumnComparator(int arg0) // for sorting (if you have a SortedList)

編集:例(迅速で汚い)

import java.util.Comparator;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.gui.AdvancedTableFormat;
import ca.odell.glazedlists.gui.WritableTableFormat;
import ca.odell.glazedlists.swing.EventTableModel;

public class Tester {

private static class MyBoolean {
    private Boolean b = Boolean.FALSE;

    public Boolean getB() {
        return b;
    }

    public void setB(Boolean b) {
        this.b = b;
    }

}

private static class BooleanTableFormat implements AdvancedTableFormat<MyBoolean>, WritableTableFormat<MyBoolean> {

    @Override
    public int getColumnCount() {
        return 1;
    }

    @Override
    public String getColumnName(int column) {
        return "Bool";
    }

    @Override
    public Object getColumnValue(MyBoolean baseObject, int column) {
        return baseObject.getB();
    }

    @Override
    public Class getColumnClass(int column) {
        return Boolean.class;
    }

    @Override
    public Comparator getColumnComparator(int column) {
        throw new IllegalStateException("Not yet implemented.");
    }

    @Override
    public boolean isEditable(MyBoolean baseObject, int column) {
        return true;
    }

    @Override
    public MyBoolean setColumnValue(MyBoolean baseObject, Object editedValue, int column) {
        baseObject.setB((Boolean) editedValue);
        return baseObject;
    }
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            EventList<MyBoolean> list = new BasicEventList<MyBoolean>();
            list.add(new MyBoolean());
            list.add(new MyBoolean());
            EventTableModel<MyBoolean> etm = new EventTableModel<MyBoolean>(list, new BooleanTableFormat());
            JTable table = new JTable(etm);
            JFrame f = new JFrame("Tester");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(300, 200);
            f.getContentPane().add(new JScrollPane(table));
            f.setVisible(true);
        }
    });

}
}
于 2011-04-21T04:43:46.173 に答える