Я слишком много пробовал и много читал. Все еще не мог найти никакого рабочего решения для моего случая. Итак, вот в чем дело. Во время игры деньги игроков меняются. Чего я пытаюсь добиться, так это мгновенно отображать деньги из JTable
, чтобы игрок всегда мог следить за своими деньгами, просто глядя на стол. Но, как вы можете предположить, у меня не получилось поменять деньги, когда их меняют. Он просто остается на том уровне, с которого начал.
На данный момент я получил хорошо построенный JTable
, который показывает начальные деньги игрока в начале и пользовательскую модель для моего JTable
.
Поскольку я считаю, что решение зависит от модели и setValuesAt(Object value, int row, int column)
, я пытался найти выход. У меня есть метод под названием Refresh. Чтобы быть более конкретным, позвольте мне показать вам часть моего кода.
Итак, вот мой массив rowData в конструкторе, который я использую для отображения начальных денег в начале игры:
rowData = new Object[][]{
{GameFlow.getPlayer1().getName(), "Pink", GameFlow.getPlayer1().getMoney()},
{GameFlow.getPlayer2().getName(), "Blue", GameFlow.getPlayer2().getMoney()},
{GameFlow.getPlayer3().getName(), "Green", GameFlow.getPlayer3().getMoney()},
{GameFlow.getPlayer4().getName(), "Red", GameFlow.getPlayer4().getMoney()},
};
Сказав это, я также должен показать вам эти две следующие функции, setValueAt и refresh (обновление — это метод, который я только что написал для простоты обновления изменений):
public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col);
}
public void refresh(){
for (int i = 0; i < 4; i++) {
setValueAt(GameFlow.getPlayer1().getMoney(), i, 2);
}
}
Здесь, при обновлении, я пытаюсь изменить только вторую (2-ю) строку, потому что первые две являются статичными и никогда не меняются. Кроме того, число 4 в цикле for — это количество игроков, поэтому 4 содержит количество строк.
Ниже вы можете найти весь код моей модели таблицы:
import javax.swing.table.AbstractTableModel;
public class MonopolyTableModel extends AbstractTableModel {
private String[] columnNames = {
"Name",
"Color",
"Money",
};
private Object[][] rowData;
public MonopolyTableModel() {
rowData = new Object[][]{
{GameFlow.getPlayer1().getName(), "Pink", GameFlow.getPlayer1().getMoney()},
{GameFlow.getPlayer2().getName(), "Blue", GameFlow.getPlayer2().getMoney()},
{GameFlow.getPlayer3().getName(), "Green", GameFlow.getPlayer3().getMoney()},
{GameFlow.getPlayer4().getName(), "Red", GameFlow.getPlayer4().getMoney()},
};
}
@Override
public int getRowCount() {
return rowData.length;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return rowData[rowIndex][columnIndex];
}
public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col);
}
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
public void refresh(){
for (int i = 0; i < 4; i++) {
setValueAt(GameFlow.getPlayer1().getMoney(), i, 2);
}
}
}
И вот как я использую в классе Gui:
MonopolyTableModel monoModel = (MonopolyTableModel) dataTable.getModel();
monoModel.refresh();
Надеюсь, этого достаточно, чтобы показать, если нужно, я могу показать больше, но, поскольку это школьный проект, я избегаю показывать много.
setValueAt
не имеет никакого отношения к фактическому объектуplayer
, поэтому любые значения, которые вы изменяете в таблице, не повлияют на объектplayer
. - person MadProgrammer   schedule 16.10.2015