Hallöchen!
Folgende Situation:
Ich habe eine jTable deren AbstractModel zur Laufzeit Daten aus der DB erhält.
Ich übergebe der Tabelle zudem noch nen CellRenderer etc:
Aufbereiten der Tabelle:
Das Model holt sich Daten aus der Datenbank und setzt in der entsprechenden Spalte einen Button mit einem ActionListener:
getValueAt() Methode aus AbstractTableModel wird überschrieben und am Ende steht halt:
So, der Button funktioniert auch wunderbar. Nur wenn ich an anderer Stelle eine Änderung an der Datenbank vornehme (lösche eine Zeile oder füge eine hinzu), dann möchte ich gerne, dass sich die jTable2 auch aktualisiert.
Dazu habe ich erstmal einen Button, der folgendes tut:
Danach führt der Button seine Action zwei mal aus, wenn man darauf klickt. Wo vorher nur ein Window geöffnet wurde, werden nun zwei geöffnet. Drücke ich nochmal refresh, wird die Action drei mal ausgeführt. Das steigert sich linear.
Ich verstehe das einfach nicht und würde das gerne beheben.
Kann mir da wer helfen?
Hier noch der restliche Code, der für den Button und die Dropdowns in der Tabelle ist:
Viele Grüße
Myar
Folgende Situation:
Ich habe eine jTable deren AbstractModel zur Laufzeit Daten aus der DB erhält.
Ich übergebe der Tabelle zudem noch nen CellRenderer etc:
Aufbereiten der Tabelle:
Code:
private void setTableRendererGames() {
MyTableModelGames gamesmodel = new MyTableModelGames();
jTable2.setModel(gamesmodel);
jTable2.getColumnModel().getColumn(0).setPreferredWidth(55);
jTable2.getColumnModel().getColumn(1).setPreferredWidth(260);
jTable2.getColumnModel().getColumn(2).setPreferredWidth(200);
jTable2.getColumnModel().getColumn(3).setPreferredWidth(270);
jTable2.getColumnModel().getColumn(4).setPreferredWidth(55);
jTable2.getColumnModel().getColumn(5).setPreferredWidth(70);
jTable2.getColumnModel().getColumn(6).setPreferredWidth(100);
jTable2.getColumnModel().getColumn(7).setPreferredWidth(100);
jTable2.getColumnModel().getColumn(8).setPreferredWidth(53);
jTable2.getColumnModel().getColumn(9).setPreferredWidth(102);
jTable2.setDefaultRenderer(Integer.class, new MyRendererInteger());
jTable2.setDefaultRenderer(String.class, new MyRenderer());
TableCellRenderer buttonRenderer = new JTableButtonRenderer();
jTable2.getColumn("Links anzeigen").setCellRenderer(buttonRenderer);
jTable2.addMouseListener(new JTableButtonMouseListener(jTable2));
jTable2.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
jTable2.setRowHeight(40);
jTable2.getColumnModel().getColumn(3).setCellEditor(new JTextAreaEditor());
jTable2.getColumnModel().getColumn(3).setCellRenderer(new JTextAreaRenderer());
setUpSportColumn(jTable2, jTable2.getColumnModel().getColumn(6),jTable2.getColumnModel().getColumn(7));
setTablesorter(gamesmodel);
}
Das Model holt sich Daten aus der Datenbank und setzt in der entsprechenden Spalte einen Button mit einem ActionListener:
getValueAt() Methode aus AbstractTableModel wird überschrieben und am Ende steht halt:
Code:
else{
final JButton button2 = new JButton(this.columnNames[col]);
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new GameLinks(id.get(row),name.get(row),false).setVisible(true);
}
});
return button2;
}
So, der Button funktioniert auch wunderbar. Nur wenn ich an anderer Stelle eine Änderung an der Datenbank vornehme (lösche eine Zeile oder füge eine hinzu), dann möchte ich gerne, dass sich die jTable2 auch aktualisiert.
Dazu habe ich erstmal einen Button, der folgendes tut:
Code:
private void jButton22ActionPerformed(java.awt.event.ActionEvent evt) {
setTableRendererGames();
}
Danach führt der Button seine Action zwei mal aus, wenn man darauf klickt. Wo vorher nur ein Window geöffnet wurde, werden nun zwei geöffnet. Drücke ich nochmal refresh, wird die Action drei mal ausgeführt. Das steigert sich linear.
Ich verstehe das einfach nicht und würde das gerne beheben.
Kann mir da wer helfen?
Hier noch der restliche Code, der für den Button und die Dropdowns in der Tabelle ist:
Code:
public void setUpSportColumn(JTable table,
TableColumn system,TableColumn genre) {
//Set up the editor for the sport cells.
comboBoxSystem = new JComboBox(new JComboBoxModelSystem());
comboBoxGenre = new JComboBox(new JComboBoxModelGenre());
system.setCellEditor(new DefaultCellEditor(comboBoxSystem));
genre.setCellEditor(new DefaultCellEditor(comboBoxGenre));
}
private void setTablesorter(MyTableModelGames gamesmodel){
final TableRowSorter<MyTableModelGames> sorter = new TableRowSorter<>(gamesmodel);
jTable2.setRowSorter(sorter);
jTable2.setFillsViewportHeight(true);
filterText.getDocument().addDocumentListener(
new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
newFilter(sorter);
}
@Override
public void insertUpdate(DocumentEvent e) {
newFilter(sorter);
}
@Override
public void removeUpdate(DocumentEvent e) {
newFilter(sorter);
}
});
}
private void newFilter(TableRowSorter<MyTableModelGames> sorter) {
RowFilter<MyTableModelGames, Object> rf;
//If current expression doesn't parse, don't update.
try {
rf = RowFilter.regexFilter("(?i)" + filterText.getText(), 1);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
}
public static class JTableButtonRenderer implements TableCellRenderer {
@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JButton button = (JButton)value;
if (isSelected) {
button.setForeground(table.getSelectionForeground());
button.setBackground(table.getSelectionBackground());
} else {
button.setForeground(table.getForeground());
button.setBackground(UIManager.getColor("Button.background"));
}
return button;
}
}
public class JTableButtonMouseListener extends MouseAdapter {
private final JTable table;
public JTableButtonMouseListener(JTable table) {
this.table = table;
}
@Override
public void mouseClicked(MouseEvent e) {
int column = table.getColumnModel().getColumnIndexAtX(e.getX());
int row = e.getY()/table.getRowHeight();
if (row < table.getRowCount() && row >= 0 && column < table.getColumnCount() && column >= 0) {
Object value = table.getValueAt(row, column);
if (value instanceof JButton) {
((JButton)value).doClick();
}
}
}
}
Viele Grüße
Myar