7

これは私を完全に狂わせています。

JTableでテーブルセルのフォーマットを変更するには、独自のレンダラーを使用する必要があることを知っています。しかし、私はこれを適切に実装できないようです。

これが私の現在の設定です:

public class MyClass
{
    public static void main(String args[])
    {
        JTable myTable = new JTable(10, 10);
        myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
    }
}

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting
        return c;
    }
}

の最初のパラメータには何を使用する必要がありますsetDefaultRendererか?APIは単に「クラス」と言います。何を置けばいいのかわからない。

誰かが、最も簡単な言葉で、これを実装する方法を説明できますか?メソッド内からフォーマットを変更する方法の例も提供してくださいmain()

4

1 に答える 1

13

の最初のパラメータにsetDefaultRenderer、レンダリングをオーバーライドするクラスのクラスリテラルを配置します。つまり、データがすべて文字列で構成されている場合は、

myTable.setDefaultRenderer(String.class, new CustomRenderer());

BigDecimalデータがクラスを含む、またはクラスとしての値で構成されている場合Integerは、クラスタイプごとに(BigDecimal.classまたはInteger.classそれぞれの場合に)そのメソッドを数回呼び出す必要があります。

そして最後に、背景色を変更するには、レンダラーでこれを行います。

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}

インターフェイスのすべてのクラスで機能するレンダラーを作成する場合は、テーブルモデルgetColumnClassの関数を変更して、このインターフェイスを実装するすべてのオブジェクトのインターフェイスクラスを返すようにする必要もあります。

public Class<? extends Object> getColumnClass(int c) {
    Object object = getValueAt(0, c);
    if(object == null) {
        return Object.class;
    if(getValueAt(0, c) instanceof IColorable) {
        return ICarPart.class;
    } else {
        return getValueAt(0, c).getClass();
    }
}

これにより、IColorable.classのレンダラーを登録でき、実装ごとに個別のレンダラーを登録する必要がなくなります。

于 2009-05-03T23:25:01.590 に答える