在 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);
}
}
我目前正在为 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);
}
}