在 ArrayList 中保存 JTable 值

Saving JTable Values in an ArrayList

我目前正在为 Yahtzee 编程,并且正在更改播放器名称。为此,我使用了一个额外的形式,其中有一个 JTable 和一个 JButton

根据 table 中玩家的可变数量,将创建一个条目,您可以在其中更改名称。只有第二列应该是 editable - 这也有效。

但是,我不知道如何通过按下按钮将第二列的内容添加到 ArrayList,以便我可以继续使用它们。

这是我自定义的实现TableModel

public class SpielerBenennungTableModel implements TableModel {

    private int spielerAnzahl = 0;    
    private ArrayList<TableModelListener> Listener = new ArrayList<TableModelListener>();

    public SpielerBenennungTableModel(int spielerAnzahl){        
        this.spielerAnzahl = spielerAnzahl;
    }

    @Override
    public int getRowCount() {
        return spielerAnzahl;
    }

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

    @Override
    public String getColumnName(int arg0) {
        if(arg0 == 0){
            return "Spieler";
        }else{
            return "Eigener Name";
        }
    }

    @Override
    public Class<?> getColumnClass(int arg0) {
        return String.class;
    }

    @Override
    public boolean isCellEditable(int arg0, int arg1) {
        if(arg1 == 1){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public Object getValueAt(int arg0, int arg1) {
        if(arg1 == 0){
            return "Spieler: " + (arg0+1);
        }else{
            return rowData[arg0][arg1];    
        }
    }


    @Override
    public void setValueAt(Object arg0, int arg1, int arg2) {         
    }

    @Override
    public void addTableModelListener(TableModelListener arg0) {
        Listener.add(arg0);
    }

    @Override
    public void removeTableModelListener(TableModelListener arg0) {
         Listener.remove(arg0);
    }

}

试试这个:

在您的 SpielerBenennungTableModel 中,您需要一个对象来保存您显示的数据。我们将使用如下所示的 List<String[]>(我将其命名为 rows):

[
  ["Spieler: 1", "Bob"],
  ["Spieler: 2", "John"]
]

每次更改值时,都会调用 setValueAt 方法并将 List<String[]> 更新为正确的值。

然后当你使用 getValueAt 方法时,它会从同一个 List<String[]>

中读取
class SpielerBenennungTableModel implements TableModel {

    private int spielerAnzahl = 0;
    private ArrayList<TableModelListener> Listener = new ArrayList<TableModelListener>();

    // this will hold the data for every rows
    private List<String[]> rows;

    public SpielerBenennungTableModel(int spielerAnzahl){
        this.spielerAnzahl = spielerAnzahl;

        // initialize the list so that all rows are
        // ["Spieler: n", ""]
        rows = new ArrayList<>();
        for(int i = 0; i<spielerAnzahl; i++) {
            this.rows.add(new String[] { "Spieler: " + (i+1), "" });
        }
    }

    @Override
    public int getRowCount() {
        return spielerAnzahl;
    }

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

    @Override
    public String getColumnName(int col) {
        return col == 0 ? "Spieler" : "Eigener Name";
    }

    @Override
    public Class<?> getColumnClass(int col) {
        return String.class;
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return col == 1;
    }

    @Override
    public Object getValueAt(int row, int col) {
        return rows.get(row)[col];
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        rows.get(row)[col] = value.toString();
    }

    @Override
    public void addTableModelListener(TableModelListener arg0) {
        Listener.add(arg0);
    }

    @Override
    public void removeTableModelListener(TableModelListener arg0) {
        Listener.remove(arg0);
    }
}