Hey Leute,
ich habe mich gerade gefreut das allles soweit funktioniert, als ich feststellen musste das es doch noch ein kleines Problem gab. Löse ich über ein JPopupMenu einen ActionListener aus, der eine Zelle ändern oder löschen soll, so ändert/löscht er die ganze Spalte. Am Anfang beim editieren nur die eine Zelle, dann jedoch beim Selektieren einer anderen Zeile ändert er auch die Zelle in der Spalte. Beim Löschen ist mir das noch unbegreiflicher, da er 5 Zellen in dieser Spalte in Folge löscht, weitere jedoch erst nach selektieren.
Ich hab leider keine Ahnung wo der Fehler liegen könnte und gebe euch deshalb einfach mal ein paar darin verwickelte Klassen an die Hand.
Das TableModel:
Der Frame in der die JTable angezeigt wird:
zum Editieren:
Zum Löschen:
Falls ihr weitere Klassen braucht, nur bescheid sagen. Hoffe auf baldige Hilfe :|
Mfg,
Jens
ich habe mich gerade gefreut das allles soweit funktioniert, als ich feststellen musste das es doch noch ein kleines Problem gab. Löse ich über ein JPopupMenu einen ActionListener aus, der eine Zelle ändern oder löschen soll, so ändert/löscht er die ganze Spalte. Am Anfang beim editieren nur die eine Zelle, dann jedoch beim Selektieren einer anderen Zeile ändert er auch die Zelle in der Spalte. Beim Löschen ist mir das noch unbegreiflicher, da er 5 Zellen in dieser Spalte in Folge löscht, weitere jedoch erst nach selektieren.
Ich hab leider keine Ahnung wo der Fehler liegen könnte und gebe euch deshalb einfach mal ein paar darin verwickelte Klassen an die Hand.
Das TableModel:
Code:
public class MyTableModel extends AbstractTableModel
{
private static final long serialVersionUID = -2987215348188188218L;
private Vector<Vector> daten = new Vector<Vector>();
private Vector<String> columnNames = new Vector<String>();
public MyTableModel(Vector<Vector> daten, Vector<String> columnNames)
{
super();
this.columnNames = columnNames;
this.daten = daten;
}
public String getColumnName(int col)
{
return columnNames.get(col).toString();
}
public int getRowCount()
{
return daten.size();
}
public int getColumnCount()
{
return columnNames.size();
}
public Object getValueAt(int row, int col)
{
return ((Vector)daten.get(row)).get(col).toString();
}
public boolean isCellEditable(int row, int col)
{
return false;
}
@SuppressWarnings("unchecked")
public void setValueAt(Object value, int row, int col)
{
daten.get(row).add(col,(String)value);
System.out.println("Setze wert "+value+": "+row+""+col);
fireTableCellUpdated(row, col);
}
}
Der Frame in der die JTable angezeigt wird:
Code:
public MyFrame() {
super();
mouseListener = new JFrameMouse(this);
fillColumnNamesVector();
fillRowDataVector();
table.setModel(new MyTableModel(rowData, columnNames));
table.getTableHeader().setReorderingAllowed(false);
buchHinzufuegenIt.addActionListener(FrameAction.getBuchHinzufuegen());
konfigurationIt.addActionListener(FrameAction.getKonfiguration());
suchenIt.addActionListener(FrameAction.getSuchen());
dateiMenu.add(buchHinzufuegenIt);
dateiMenu.add(konfigurationIt);
dateiMenu.add(suchenIt);
menuBar.add(dateiMenu);
table.addMouseListener(mouseListener);
table.setVisible(true);
JScrollPane scrollbar = new JScrollPane(table);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(700, 500);
getContentPane().add(scrollbar);
setJMenuBar(menuBar);
setVisible(true);
}
private void fillColumnNamesVector() {
columnNames.add("Titel");
columnNames.add("Autor");
columnNames.add("ISBN");
columnNames.add("Verliehen");
columnNames.add("An Wen");
columnNames.add("Anzahl");
}
private void fillRowDataVector() {
for (int i = 0; i < 10; i++) {
daten.add("Titel");
daten.add("Autor");
daten.add("ISBN");
daten.add("Verliehen");
daten.add("An Wen");
daten.add("Anzahl");
rowData.add(daten);
}
}
public JFrame getJFrame() {
return this;
}
public JTable getTable() {
return table;
}
public void setTable(JTable newTable) {
table = newTable;
}
public void deleteRow(int row) {
/**
* ToDo: Datenbank Zeile löschen lassen, danach repaint der Table...
*/
table.repaint();
}
public static Vector<Vector> getRowData(){
return rowData;
}
public static Vector<String> getDaten(){
return daten;
}
public static Vector<String> getColumnNames(){
return columnNames;
}
public void tableRepaint()
{
table.repaint();
}
zum Editieren:
Code:
public VerleihEditierenAction(VerleihEditieren verleihEditieren, MyFrame parent)
{
this.verleihEditieren = verleihEditieren;
this.parent = parent;
}
public void actionPerformed(ActionEvent arg0)
{
if(arg0.getSource() == verleihEditieren.getClose())
{
verleihEditieren.close();
}
else if(arg0.getSource() == verleihEditieren.getAendern())
{
JTable table = verleihEditieren.getTable();
String newValue = verleihEditieren.getNewValue();
int atRow = verleihEditieren.getSelectedRow();
int atColumn = verleihEditieren.getColumn();
String cache = (String)table.getValueAt(atRow, atColumn+1);
if(!newValue.equals(""))
{
table.setValueAt("Verliehen",atRow,atColumn-1);
}
table.setValueAt(newValue,atRow,atColumn);
table.setValueAt(cache,atRow,atColumn+1);
parent.setTable(table);
}
}
Zum Löschen:
Code:
public VerleihLoeschen(MyFrame parent)
{
JTable table = parent.getTable();
String anzahl = (String) table.getValueAt(table.getSelectedRow(),5);
table.setValueAt("Nicht Verliehen",table.getSelectedRow(),3);
table.setValueAt("",table.getSelectedRow(),4);
table.setValueAt(""+anzahl,table.getSelectedRow(),5);
parent.setTable(table);
parent.tableRepaint();
}
Falls ihr weitere Klassen braucht, nur bescheid sagen. Hoffe auf baldige Hilfe :|
Mfg,
Jens