Hallo,
ich nähere mich der 1000. gefahr
Ich hab eine JTable für das TicTacToe-Spiel. Schien mir am naheliegendsten und Best Practice. Die JTable hat ein eigenes Model und einen eigenen Renderer:
private static final JTable jt = new JTable(new AbstractTableModel() {
@Override
public int getColumnCount() {
return spiel.length;
}
@Override
public int getRowCount() {
return spiel[0].length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return spiel[rowIndex][columnIndex];
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
spiel[rowIndex][columnIndex] = (int) aValue;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
});
jt.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
JLabel jl = new JLabel();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
jl.setOpaque(true);
switch (spiel[row][column]) {
case 0:
jl.setBackground(Color.white);
break;
case +1:
jl.setBackground(Color.green);
break;
case -1:
jl.setBackground(Color.red);
break;
default:
throw new AssertionError();
}
return jl;
}
});
jt.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JTable target = (JTable) e.getSource();
int row = target.getSelectedRow();
int column = target.getSelectedColumn();
if (spiel[row][column] != 0) {
return;
}
// tue was mit row und column ...
}
});
jf.add(jt, BorderLayout.CENTER);```
Bis hierhin wahrscheinlich easy going.
Die Daten von Spiel ändere ich so z. B.:
```spiel[1][1] = +1;```
und dann rufe ich Update auf, entweder:
```((AbstractTableModel) jt.getModel()).fireTableDataChanged();``` (gracefully)
oder:
```jt.repaint();```
****[U]Problem:[/U]****
Das Aktualisieren der Zellen ist langsam oder Zellen werden gar nicht aktualisiert (Aktualisierung findet nicht für den Benutzer merklich statt).
Workaround: Alle Aktualisierungen innerhalb des EDTs. Nächstes Problem: EDT läuft über / Overflow.
Was sollte ich also tun, um `int[][] spiel = new int[3][3];` (mit vielen Änderungen) korrekt darzustellen?
Grüße an alle