0

以下は、接続された JTable に行を追加する JButton を追加しようとする私のコードです。

私の変数を以下に示します。テーブルと tbm は作成されますが、現在表示されていないプログラムの別の部分で初期化されました。これらはすべてインスタンス変数です。

int currentUser = 0;
JTable[] tables = new JTable[5];
DefaultTableModel[] tbm = new DefaultTableModel[5];
JButton[] addRow = new JButton[5]

これは、アクション リスナーを使用して JButton を作成するためのコードです。

for(int i=0;i<tbm.length;i++) {
addRow[i] = new JButton("Add Row");
selectionModel = tables[i].getSelectionModel();
currentUser=i;
addRow[i].addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {
Object[] temp = {"",""};
tbm[currentUser].addRow(temp);
selectionModel.setSelectionInterval(tbm[currentUser].getRowCount()-1,tbm[currentUser].getRowCount()-1);
}});
}

後で、0-tables.length から実行される for ループを使用して JTable と JButton を JPanel にアセンブルし、それぞれの JFrame に配置します。ここでの問題は、ボタンを押すと、間違った actionListener がトリガーされることです。たとえば、フレーム 0 で「Add Row」を押すと、addRow[0] がトリガーされるはずですが、代わりに addRow[4] がトリガーされます。

4

1 に答える 1

1

tables[currentUser]ボタンがクリックされるたびに、テーブルに行を追加しています。table[X]ボタン X をクリックしたときに行を追加したいようですね。

for(int i=0;i<tbm.length;i++) {
    final int tblIdx = i;
    addRow[i] = new JButton("Add Row");
    selectionModel = tables[i].getSelectionModel();
    currentUser=i;
    addRow[i].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Object[] temp = {"",""};
            tbm[tblIdx].addRow(temp);
            selectionModel.setSelectionInterval(tbm[tblIdx].getRowCount()-1,tbm[tblIdx].getRowCount()-1);
        }
    });
}

i最終変数ではないため、匿名に直接渡すことはできませんActionListener。したがって、ループの各反復の開始時に、一時的な最終変数tblIdxが作成され、i現在のものに設定されます。

個人的には、テーブル インデックスをサブクラスActionListener化し、パラメーターとしてコンストラクターに渡すことでこれを実現しますが、それは私だけです。

于 2012-06-08T16:45:12.087 に答える