-1

AbstractTableModel を実装するための Oracle のモデルに従いました

http://download.oracle.com/javase/tutorial/uiswing/examples/components/TableDemoProject/src/components/TableDemo.java

これを行ったのは、テーブルに 3 つの列を含める必要があり、最初の列が JCheckBox でなければならないためです。

これが私のコードです:

public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel {
private String[] columnNames = {"Auswahl",
                                    "Dateiname",
                                    "Pfad"};
    private Object[][] data = {
    {new Boolean(true), "datei.tmp",
     "/home/user/tmp"}
    };

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

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

     public boolean isCellEditable(int row, int col) {
        if (col == 0) {
            return true;
        } else {
            return false;
        }
    }

     public void setValueAt(Object value, int row, int col) {            
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

}

ここに私の質問があります:

  1. JTable ( new JTable(FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel)) は、列名とその値をどのように認識しますか? 私の AbstractTableModel にはコンストラクターがないので?! columnNames と data はそのままの名前を付ける必要があり、JTable がそれらにアクセスするためですか?
  2. JTable に新しい値を入れるにはどうすればよいですか? columnNames と data は配列なので。それらをベクターに置き換えることはできますか? もしそうなら、どうすればこれらのベクトルを初期化できますか? myAbsTableModel のコンストラクタで?

解決策を見つけるのは非常に簡単だと思いますが、このテーブルの処理は私にとって簡単ではないので、どうもありがとうございました!

4

3 に答える 3

2

すべての Swing コンポーネントには、デフォルトのモデル実装が付属しています。独自のものを作成する前に、まずそれらの使用方法を理解することをお勧めします。JTable の場合、DefaultTableModel と呼ばれます。モデルからデータ行を動的に追加/削除するメソッドの API を参照してください。開始するための簡単な例を次に示します。

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableBasic extends JPanel
{
    public TableBasic()
    {
        String[] columnNames = {"Date", "String", "Integer", "Boolean"};

        Object[][] data =
        {
            {new Date(), "A", new Double(1), Boolean.TRUE },
            {new Date(), "B", new Double(2), Boolean.FALSE},
            {new Date(), "C", new Double(9), Boolean.TRUE },
            {new Date(), "D", new Double(4), Boolean.FALSE}
        };

        JTable table = new JTable(data, columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers and editors to be used based on Class

            public Class getColumnClass(int column)
            {
                for (int row = 0; row < getRowCount(); row++)
                {
                    Object o = getValueAt(row, column);

                    if (o != null)
                        return o.getClass();
                }

                return Object.class;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("TableBasic");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableBasic() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
于 2010-11-29T16:36:20.887 に答える
0

まず、Java、特に継承についてもう少し学ぶ必要があると思います (コンストラクターの問題について言及しています。

ご質問への回答:

  • private final static列名が変更されないと仮定して、属性を介して列名を定義します。
  • クラスは extendsAbstractTableModelであるため、データを渡すコンストラクターを定義できます。メソッドを再定義してgetValueAt、モデルが渡すデータを使用できるようにします。

いくつかのアドバイス:

  • あなたがしていることをしないでくださいgetColumnClass。通常、列内のすべての要素は同じクラスを持つためswitch、列インデックスに対して を実行してクラスを取得します。
  • 列の 1 つにa を追加するJCheckBoxには、カスタムを使用する必要がありますTableCellRenderer
于 2010-11-29T12:42:16.477 に答える
0
  1. JTable は、列モデルで getColumnCount() を呼び出して、列の数を決定します。次に、列ごとに反復して getColumnName(idx) を呼び出します。あなたのクラスは列名を伝えます - これらのメソッドの実装を見てください。

  2. 必要な形式でデータを保存できます。JTable は、テーブル モデルのメソッドを呼び出してそのデータを取得します。モデルに新しい項目を追加したい場合は、addItem(Object o) メソッドをモデルに実装できます。新しいアイテムごとに必ず fireTableRowsInserted() を呼び出してください。

于 2010-11-29T12:44:23.443 に答える