Hallo zusammen,
da das mein erster Post ist, vielleicht eine kurze Vorstellung meiner Person:
Von Beruf bin ich Vermesser, programmiere aber in meiner freien Zeit etwas in Java. Nun zu meinem Programmfehler.
Ich erzeuge ein JTable mit eigenem TableModel. Die JTable hat bis zum jetzigen Zeitpunkt gut funktioniert, doch nun möchte ich meine JTable editierbar machen und habe mein Tabellen model etwas umgeschrieben. Vorher funktionierte mein Tabellemodel über eine übergebene ArrayList, die ich in Vekoren umgewandelt habe. In meinem umgescchriebenen Tabellenmodel übergebe ich die ArrayList vom Typ(selbstprogramierte Klasse Protokoll mit Datentypen Boolean, String, Integer, Double und Date ) direkt und habe demzufolge die Methoden getValueAt() und setValueAt() so umgeschrieben, dass sie für meine ArrayList direkt funktioniert.
Im folgenden Code erzeuge ich meine Tabelle:
Das ist mein dazugehöriges Tabellenmodel:
Wenn ich den Code nun ausführe erhalte ich folgendes Ergebnis:
Als wichtige Erkenntnis meinerseits:
Wenn ich die Tabelle editiere, erhalte ich eine ClassCastException von String auf Boolean bzw. es scheint als wenn er die Tabelle mit Stringfelder füllt, obwohl ich getValueAt mit Object füttere.
Ich bin für jeden Hinweis dankbar.
da das mein erster Post ist, vielleicht eine kurze Vorstellung meiner Person:
Von Beruf bin ich Vermesser, programmiere aber in meiner freien Zeit etwas in Java. Nun zu meinem Programmfehler.
Ich erzeuge ein JTable mit eigenem TableModel. Die JTable hat bis zum jetzigen Zeitpunkt gut funktioniert, doch nun möchte ich meine JTable editierbar machen und habe mein Tabellen model etwas umgeschrieben. Vorher funktionierte mein Tabellemodel über eine übergebene ArrayList, die ich in Vekoren umgewandelt habe. In meinem umgescchriebenen Tabellenmodel übergebe ich die ArrayList vom Typ(selbstprogramierte Klasse Protokoll mit Datentypen Boolean, String, Integer, Double und Date ) direkt und habe demzufolge die Methoden getValueAt() und setValueAt() so umgeschrieben, dass sie für meine ArrayList direkt funktioniert.
Im folgenden Code erzeuge ich meine Tabelle:
Java:
tmodel = null;
tmodel = new TabModelUEB(uebProtListe);
meineTabelle = null;
meineTabelle=new JTable(tmodel);
//TabCellEditorUEB celleditor=new TabCellEditorUEB();
//meineTabelle.setCellEditor(celleditor);
for(int i=0; i<22; i++){
TableColumn tc = meineTabelle.getColumnModel().getColumn(i);
tc.setCellEditor(meineTabelle.getDefaultEditor(tmodel.getColumnClass(i)));
tc.setCellRenderer(meineTabelle.getDefaultRenderer(tmodel.getColumnClass(i)));
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setHorizontalAlignment(JLabel.CENTER);
meineTabelle.setDefaultRenderer(tmodel.getColumnClass(i), renderer);
}
meineTabelle.setFont(foTabelle);
meineTabelle.getTableHeader().setFont(foTabelle);
int dimProt = uebProtListe.size() * 20;
meineTabelle.setPreferredSize(new Dimension(1200, dimProt));
js2.getViewport().add(meineTabelle);
meineTabelle.setRowHeight(20);
meineTabelle.getColumnModel().getColumn(0).setPreferredWidth(5);//Druck
meineTabelle.getColumnModel().getColumn(1).setPreferredWidth(5);//DruckFS
meineTabelle.getColumnModel().getColumn(2).setPreferredWidth(5);//Nr.
meineTabelle.getColumnModel().getColumn(3).setPreferredWidth(20);//Datum
meineTabelle.getColumnModel().getColumn(4).setPreferredWidth(150);//Abschnitt
meineTabelle.getColumnModel().getColumn(5).setPreferredWidth(15);//Srecke
meineTabelle.getColumnModel().getColumn(6).setPreferredWidth(5);//Ri
meineTabelle.getColumnModel().getColumn(7).setPreferredWidth(30);//Art
meineTabelle.getColumnModel().getColumn(8).setPreferredWidth(20);//vkm
meineTabelle.getColumnModel().getColumn(9).setPreferredWidth(20);//bKm
meineTabelle.getColumnModel().getColumn(10).setPreferredWidth(30);//Dist
meineTabelle.getColumnModel().getColumn(11).setPreferredWidth(5);//GEOM
meineTabelle.getColumnModel().getColumn(12).setPreferredWidth(5);//EXTVER
meineTabelle.getColumnModel().getColumn(13).setPreferredWidth(5);//FIX
meineTabelle.getColumnModel().getColumn(14).setPreferredWidth(5);//BSTG
meineTabelle.getColumnModel().getColumn(15).setPreferredWidth(5);//SPUR
meineTabelle.getColumnModel().getColumn(16).setPreferredWidth(30);//Datei
meineTabelle.getColumnModel().getColumn(17).setPreferredWidth(30);//Disk
meineTabelle.getColumnModel().getColumn(18).setPreferredWidth(20);//svkm
meineTabelle.getColumnModel().getColumn(19).setPreferredWidth(20);//sbkm
meineTabelle.getColumnModel().getColumn(20).setPreferredWidth(35);//Schicht
meineTabelle.getColumnModel().getColumn(21).setPreferredWidth(30);//sDat
meineTabelle.setVisible(true);
meineTabelle.validate();
Das ist mein dazugehöriges Tabellenmodel:
Java:
package gui;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.table.AbstractTableModel;
import logik.Protokoll;
public class TabModelUEB extends AbstractTableModel{
/**
*
*/
private static final long serialVersionUID = 1L;
public String columnNames[]=new String[]{"Druck","DruckFS", "Nr.","Datum","Abschnitt","Strecke","Ri","Art","von [km]","bis [km]","Dist [m]","GEOM","EXTVER", "FIX", "BSTG", "SPUR","Datei","DISK/USB", "svon [km]", "sbis [km]", "Schicht","StopfDat","Bemerkung"}; private Object value;
private SimpleDateFormat datF =new SimpleDateFormat("dd.MM.yy");
private DecimalFormat dform =new DecimalFormat("##0.000");
private DecimalFormat dform1 =new DecimalFormat("##0.0");
private ArrayList<Protokoll>uebProtListe;
public TabModelUEB(){}
public TabModelUEB(ArrayList<Protokoll>uebProtListe){
this.uebProtListe=uebProtListe;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return uebProtListe.size();
}
@Override
public Class<?> getColumnClass(int colIndex) {
Class<?> v=null;
switch (colIndex){
case 0: v= Boolean.class;
case 1: v= Boolean.class;
case 2: v= Integer.class;
case 3: v= Date.class;
case 4: v= String.class;
case 5: v= Integer.class;
case 6: v= Integer.class;
case 7: v= String.class;
case 8: v= Double.class;
case 9: v= Double.class;
case 10: v= Double.class;
case 11: v= Boolean.class;
case 12: v= Boolean.class;
case 13: v= Boolean.class;
case 14: v= Boolean.class;
case 15: v= Boolean.class;
case 16: v= String.class;
case 17: v= String.class;
case 18: v= Double.class;
case 19: v= Double.class;
case 20: v= String.class;
case 21: v= Date.class;
case 22: v= String.class;
}
return v;
}
public String getColumnName(int column) {
return columnNames[column];
}
public Object getValueAt(int rowIndex, int columnIndex) {
Object value=null;
Protokoll Prot= uebProtListe.get(rowIndex);
switch (columnIndex){
case 0: value=(Object)(Prot.isDruck());
case 1: value=(Object)(Prot.isDruckFS());
case 2: value=(Object)(Prot.getNr());
case 3: value=(Object)(Prot.getDatum());
case 4: value=(Object)(Prot.getAbschnitt());
case 5: value=(Object)(Prot.getStrecke());
case 6: value=(Object)(Prot.getRi());
case 7: value=(Object)(Prot.getArt());
case 8: value=(Object)(Prot.getGemVkm());
case 9: value=(Object)(Prot.getGemBkm());
case 10: value=(Object)(Prot.getDistM());
case 11: value=(Object)(Prot.isGeom());
case 12: value=(Object)(Prot.isExtver());
case 13: value=(Object)(Prot.isFix());
case 14: value=(Object)(Prot.isBstg());
case 15: value=(Object)(Prot.isSpur());
case 16: value=(Object)(Prot.getDatName());
case 17: value=(Object)(Prot.getDatentraegerArt());
case 18: value=(Object)(Prot.getStVkm());
case 19: value=(Object)(Prot.getStBkm());
case 20: value=(Object)(Prot.getSchichtBez());
case 21: value=(Object)(Prot.getStopfDat());
case 22: value=(Object)(Prot.getBem());
}
return value;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public void setValueAt(Object val, int rowIndex, int columnIndex) {
Protokoll Prot=uebProtListe.get(rowIndex);
switch (columnIndex){
case 0: Prot.setDruck((boolean)(val));
uebProtListe.set(rowIndex, Prot);//
case 1: Prot.setDruckFS((boolean)(val));
uebProtListe.set(rowIndex, Prot);//
case 2: Prot.setNr((int)(val));
uebProtListe.set(rowIndex, Prot);//
case 3: Prot.setDatum((Date)(val));
uebProtListe.set(rowIndex, Prot);//
case 4: Prot.setAbschnitt(String.valueOf(val));//
uebProtListe.set(rowIndex, Prot);
case 5: Prot.setStrecke((int)(val));
uebProtListe.set(rowIndex, Prot);//
case 6: Prot.setRi((int)(val));
uebProtListe.set(rowIndex, Prot);
case 7: Prot.setArt(String.valueOf(val));
uebProtListe.set(rowIndex, Prot);
case 8: Prot.setGemVkm((double)(val));
uebProtListe.set(rowIndex, Prot);
case 9: Prot.setGemBkm((double)(val));
uebProtListe.set(rowIndex, Prot);
case 10: Prot.setDistM((double)(val));
uebProtListe.set(rowIndex, Prot);
case 11: Prot.setGeom((boolean)(val));
uebProtListe.set(rowIndex, Prot);
case 12: Prot.setExtver((boolean)(val));
uebProtListe.set(rowIndex, Prot);
case 13: Prot.setFix((boolean)(val));
uebProtListe.set(rowIndex, Prot);
case 14: Prot.setBstg((boolean)(val));
uebProtListe.set(rowIndex, Prot);
case 15: Prot.setSpur((boolean)(val));
uebProtListe.set(rowIndex, Prot);
case 16: Prot.setDatName(String.valueOf(val));
uebProtListe.set(rowIndex, Prot);
case 17: Prot.setDatentraegerArt(String.valueOf(val));
uebProtListe.set(rowIndex, Prot);
case 18: Prot.setStVkm((double)(val));
uebProtListe.set(rowIndex, Prot);
case 19: Prot.setStBkm((double)(val));
uebProtListe.set(rowIndex, Prot);
fireTableCellUpdated(rowIndex,columnIndex);
case 20: Prot.setSchichtBez(String.valueOf(val));
uebProtListe.set(rowIndex, Prot);
case 21: Prot.setStopfDat((Date)(val));
uebProtListe.set(rowIndex, Prot);
default: Prot.setBem(String.valueOf(val));
uebProtListe.set(rowIndex, Prot);}
fireTableCellUpdated(rowIndex,columnIndex);
}
}
Wenn ich den Code nun ausführe erhalte ich folgendes Ergebnis:
Als wichtige Erkenntnis meinerseits:
Wenn ich die Tabelle editiere, erhalte ich eine ClassCastException von String auf Boolean bzw. es scheint als wenn er die Tabelle mit Stringfelder füllt, obwohl ich getValueAt mit Object füttere.
Ich bin für jeden Hinweis dankbar.