0

Frame に JTable を表示する方法を学びましたが、実際にデータを変更する方法がわかりません。このテーマに関するチュートリアルをたくさん読みましたが、何もクリックしていないようです。以下のコードに関するいくつかの質問に答えていただけますか?

1) actionListener で、tab.getModel().getValueAt(1,1) と tab.getValueAt(1,1) を呼び出します。「ささいなこと」と同じデータが得られます。同じデータを配信する場合、「getModel()」は必要ですか?


"getModel()" を使用すると、CustomTable.java クラスに記述した任意のカスタム メソッドにアクセスできると思いましたが、そうではないようです。

コマンド tab.getModel().setValueAt(pane, 1, 2); 何もしません。メソッドで System.out.println コマンドを実行することすらありません。したがって、メソッドは呼び出されません。

2) 「getValueAt」は呼び出せるのに「setValueAt」は呼び出せないのはなぜですか?


「test()」という新しいメソッドを書きました。actionPerformed メソッドで呼び出すと、コンパイル エラーが発生します。メソッドが存在しないかのようです。

3) では、AbstractTable モデルでこれらのカスタム メソッドを呼び出すにはどうすればよいでしょうか?

私が現在取り組んでいるプログラムでは、SQL クエリの結果がテーブルに入力されます。以下の ArrayList にクエリから構築されたカスタム オブジェクトを設定する Service クラスのメソッドがあります。それはデータをうまく表示します。

AbstractTableModel クラスに "reQuery" メソッドを作成しました。このメソッドは、Service のメソッドを呼び出し、新しいクエリからのデータを ArrayList に再設定します。このメソッドは正しく動作しますが、呼び出すことができません (テーブル データの更新はなおさらです)。

ここで何が欠けていますか?


主なメソッドは「new MainFrame();」だけです。MainFrame クラスと CustomTable クラスは以下のとおりです。

package scratchpad3;
import javax.swing.*;
import java.awt.event.*;
public class MainFrame extends JFrame implements ActionListener {

JPanel pane = new JPanel();
JButton butt = new JButton("Push Me To Update The Table");
JTable tab = new JTable(new CustomTable());

MainFrame(){
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(1000,200,1000,1000);
    pane.setLayout(null);
    add(pane);   
    butt.setBounds(20,10,200,100);
    butt.addActionListener(this);
    pane.add(butt);     
    tab.setBounds(20,125,500,500);
    pane.add(tab);
        tab.setValueAt(pane, 1, 2);
    }    
public void actionPerformed(ActionEvent e){
    System.out.println("With getModel() " + tab.getModel().getValueAt(1, 1) );
    System.out.println("Without getModel() " + tab.getValueAt(1, 1) );
    tab.getModel().setValueAt("Tampa", 1, 2); 
    tab.getModel().test();
    }    
}

CustomTable.java

package scratchpad3;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;

public class CustomTable extends AbstractTableModel {
    String[] colName = {"First Name", "Last Name", "City", "State"};
    ArrayList<String[]> rows = new ArrayList<String[]>();
    public String getColumnName(int col){
        return colName[col];
    }

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

    public int getRowCount(){
        return rows.size();
    }

    public String getValueAt(int row, int col){
        System.out.println("getValueAt method was called."); //To verify the method was called
        String[] s = rows.get(row);
        return s[col];
    }

    public boolean isCellEditable(int col, int row){
        return true;
    }

    public void setValueAt(String s, int row, int col){
        System.out.println("setValueAt method was called"); //To verify the method was called
        rows.get(row)[col] = s;
        fireTableDataChanged();
    }

    public void test(){
        System.out.println("Test");
    }

    CustomTable(){
        rows.add(new String[]{"Bob", "Barker", "Glendale", "CA"});
        rows.add(new String[]{"Tom", "Petty", "Jacksonville", "FL"});
    }
}
4

1 に答える 1

2

AbstractTableModel.setValueAt間違った署名を使用しているため、メソッドをオーバーライドしません。public void setValueAt(Object s, int row, int col)の代わりにする必要がありpublic void setValueAt(String s, int row, int col)ます。

于 2013-07-04T20:32:09.823 に答える