Swing Inhalt meines JTables wird falsch dargestellt

MARJAVA

Aktives Mitglied
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:
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:
gezeichneteTabelle.JPG

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.
 
Könnte daran liegen, dass Du im Switch Case alle breaks vergessen hast und deshalb immer Typ String zurück gegeben wird...

Das Gleiche Problem dann eben auch beim SetValue()

Gruß

Claus
 
Danke für die schnelle Antwort,
das war natürlich der Fehler und die Zeile in Case 19 ist in der Tat ein Relikt.
Ich hatte mich zu sehr auf den Datentyp "Object" konzentriert. Jetzt kann ich mich mit dem Tabellenupdate beschäftigt. Im Erfolgsfall oder Misserfolgsfall werde ich den Code sicher posten.
 
Hallo zusammen,
weiterführend poste ich ich meinen Code.
Er funktioniert jetzt einwandfrei. Danke nochmals.

Ich musste neben meinem TableModelconstructor auch die getter und setter methoden für meine ArrayList einbauen um ein flexibles TabellModell zu basteln.

Java:
tmodel = null;
                        tmodel = new TabModelUEB(uebProtListe,fehlerlogdatei);
                        meineTabelle = null;
                        meineTabelle=new JTable(tmodel);
                       
                        for(int u=0; u<22; u++){
                           
                            if((u==0)||(u==1)||(u==11)||(u==12)||(u==13)||(u==14)||(u==15)){
                                TableColumn tcCheck = meineTabelle.getColumnModel().getColumn(u);
                                JCheckBox check=new JCheckBox();
                                tcCheck.setCellEditor(new DefaultCellEditor(check));
                               
                           
                            }else if((u==7)){
                                TableColumn tcCombo = meineTabelle.getColumnModel().getColumn(u);
                                String[] artCombo={"DUA", "Verl.", "HV","Stab1","Stab1", "Stab2", "SIV"};
                                JComboBox<String> combo=new JComboBox<String>(artCombo);
                                tcCombo.setCellEditor(new DefaultCellEditor(combo));
                            }else{
                                TableColumn tcText = meineTabelle.getColumnModel().getColumn(u);
                                JTextField text=new JTextField();
                                tcText.setCellEditor(new DefaultCellEditor(text));
                               
                                DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
                                renderer.setHorizontalAlignment(JLabel.CENTER);
                                meineTabelle.setDefaultRenderer(tmodel.getColumnClass(u), 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(22).setPreferredWidth(100);//sDat
                        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(30);//vkm
                        meineTabelle.getColumnModel().getColumn(9).setPreferredWidth(30);//bKm
                        meineTabelle.getColumnModel().getColumn(10).setPreferredWidth(40);//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(30);//svkm
                        meineTabelle.getColumnModel().getColumn(19).setPreferredWidth(30);//sbkm
                        meineTabelle.getColumnModel().getColumn(20).setPreferredWidth(40);//Schicht
                        meineTabelle.getColumnModel().getColumn(21).setPreferredWidth(30);//sDat
                        meineTabelle.getColumnModel().getColumn(4).setPreferredWidth(80);//Abschnitt
                        meineTabelle.setVisible(true);
                        meineTabelle.validate();

TableModel:

Java:
package gui;

import java.awt.HeadlessException;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JOptionPane;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

import logik.DatInfos;
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 DecimalFormat dform =new DecimalFormat("##0.000");
    private DecimalFormat dform1 =new DecimalFormat("##0.0");

    private ArrayList<Protokoll>uebProtListe;
    private ArrayList<Protokoll>uebProtListeDrucken;
    private File fehlerlogdatei;
    private WriterEx writerEx;

   
    public TabModelUEB(){}
    public TabModelUEB(ArrayList<Protokoll>uebProtListe,File fehlerlogdatei) throws IOException{
        this.uebProtListe=uebProtListe;
        this.fehlerlogdatei=fehlerlogdatei;
        writerEx=new WriterEx(fehlerlogdatei);
       
    }
   
    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;
        break;
        case 1:    v=  Boolean.class;
        break;
        case 2: v=  Integer.class;
        break;
        case 3: v=  String.class;
        break;       
        case 4:    v=  String.class;
        break;       
        case 5:    v=  Integer.class;
        break;       
        case 6:    v=  Integer.class;
        break;       
        case 7:    v=  String.class;
        break;       
        case 8:    v=  Double.class;
        break;       
        case 9:    v=  Double.class;
        break;       
        case 10: v=  Double.class;
        break;       
        case 11: v=  Boolean.class;
        break;       
        case 12: v=  Boolean.class;
        break;       
        case 13: v=  Boolean.class;
        break;       
        case 14: v=  Boolean.class;
        break;       
        case 15: v=  Boolean.class;
        break;       
        case 16: v=  String.class;
        break;       
        case 17: v=  String.class;
        break;
        case 18: v=  Double.class;
        break;       
        case 19: v=  Double.class;
        break;       
        case 20: v=  String.class;
        break;       
        case 21: v=  String.class;
        break;       
        case 22: v=  String.class;
        break;
        }
       
        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());
        break;               
        case 1:    value=(Object)(Prot.isDruckFS());
        break;
        case 2: value=(Object)(Prot.getNr());
        break;
        case 3: value=(Object)(Prot.getDatum());
        break;
        case 4:    value=(Object)(Prot.getAbschnitt());
        break;
        case 5:    value=(Object)(Prot.getStrecke());
        break;
        case 6:    value=(Object)(Prot.getRi());
        break;
        case 7:    value=(Object)(Prot.getArt());
        break;
        case 8:    value=(Object)(dform.format(Prot.getGemVkm()));
        break;
        case 9:    value=(Object)(dform.format(Prot.getGemBkm()));
        break;
        case 10: value=(Object)(dform1.format(Prot.getDistM()));
        break;
        case 11: value=(Object)(Prot.isGeom());
        break;
        case 12: value=(Object)(Prot.isExtver());
        break;
        case 13: value=(Object)(Prot.isFix());
        break;
        case 14: value=(Object)(Prot.isBstg());
        break;
        case 15: value=(Object)(Prot.isSpur());
        break;
        case 16: value=(Object)(Prot.getDatName());
        break;
        case 17: value=(Object)(Prot.getDatentraegerArt());
        break;
        case 18: value=(Object)(dform.format(Prot.getStVkm()));
        break;
        case 19: value=(Object)(dform.format(Prot.getStBkm()));
        break;
        case 20: value=(Object)(Prot.getSchichtBez());
        break;
        case 21: value=(Object)(Prot.getStopfDat());
        break;
        case 22: value=(Object)(Prot.getBem());
        break;}
                return value;
   

    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    @Override
    public void setValueAt(Object val, int rowIndex, int columnIndex) {
           
       
       
        try {
            Protokoll Prot=uebProtListe.get(rowIndex);
               
               
            switch (columnIndex){
            case 0: Prot.setDruck((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);
                    System.out.println(Prot.isDruck());
                    break;       
            case 1:    Prot.setDruckFS((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);//
                    break;
            case 3: Prot.setDatum((String.valueOf(val)));
                    uebProtListe.set(rowIndex, Prot);//
                    break;
            case 4:    Prot.setAbschnitt(String.valueOf(val));//
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 5:    int str=Integer.parseInt(String.valueOf(val));
                    Prot.setStrecke(str);
                    uebProtListe.set(rowIndex, Prot);//
                    break;
            case 6:    int ri=Integer.parseInt(String.valueOf(val));
                    Prot.setRi(ri);
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 7:    Prot.setArt(String.valueOf(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 8:    double distv=0;
                    Prot.setGemVkm(Double.parseDouble(String.valueOf(val)));
                    distv=Prot.getGemBkm()-Prot.getGemVkm();
                    Prot.setDistM(distv*1000);
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 9:    double distb=0;
                    Prot.setGemBkm(Double.parseDouble(String.valueOf(val)));
                    distb=Prot.getGemBkm()-Prot.getGemVkm();
                    Prot.setDistM(distb*1000);
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 11: Prot.setGeom((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 12: Prot.setExtver((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 13: Prot.setFix((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 14: Prot.setBstg((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 15: Prot.setSpur((boolean)(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 16:
                String testDatname1="";
                String testDatname2="";
               
                //Abfangen von Fehlern im Dateinamen WCHTIG!   
                String probeString =String.valueOf(val);
                for(int i=0; i<probeString.length();i++){
                    if((Character.isLetter(probeString.charAt(i))==true)||(Character.isDigit(probeString.charAt(i))==true)){
                        testDatname1="kontrolliert";
                    }else{
                        JOptionPane.showMessageDialog(null, " Bitte Sonderzeichen aus Dateinamen entfernen!", "Dateiname", JOptionPane.OK_CANCEL_OPTION);
                        testDatname1="falsch";
                        break;
                    }
                }
               
                if((probeString.length()<=8)){
                    testDatname2="kontrolliert";
                }else{
                    testDatname2="falsch";
                    JOptionPane.showMessageDialog(null, " Dateinamen kürzen auf 8 Zeichen!", "Dateiname", JOptionPane.OK_CANCEL_OPTION);
                   
                }
               
                if((testDatname1.equals("kontrolliert"))&&(testDatname2.equals("kontrolliert"))){
                Prot.setDatName(String.valueOf(val));
                    uebProtListe.set(rowIndex, Prot);
                   
                }
                break;
               
               
            case 17: Prot.setDatentraegerArt(String.valueOf(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 18:double vskm=(Double.parseDouble(String.valueOf(val)));
                    Prot.setStVkm(vskm);
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 19:double bskm =(Double.parseDouble(String.valueOf(val)));
                    Prot.setStBkm(bskm);
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 20: Prot.setSchichtBez(String.valueOf(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 21: Prot.setStopfDat(String.valueOf(val));
                    uebProtListe.set(rowIndex, Prot);
                    break;
            case 22:
                if(String.valueOf(val).contains("200kmh")){
                    Prot.setSfs(true);
                }else{
                    Prot.setSfs(false);
                }
                if(String.valueOf(val).contains("KMS a.A.")){
                    Prot.setKsaa(true);
                }
                if(String.valueOf(val).contains("KMS a.E.")){
                    Prot.setKsae(false);
                   
                }       
                Prot.setBem(String.valueOf(val));
                    uebProtListe.set(rowIndex, Prot);break;}
           
                    fireTableCellUpdated(rowIndex,columnIndex);
        } catch (NumberFormatException e) {
           
            // TODO Automatisch generierter Erfassungsblock
            e.printStackTrace();
            try {
                writerEx.printNumberFormatException(e);
               
            } catch (IOException e2) {
                // TODO Automatisch generierter Erfassungsblock
                e2.printStackTrace();
            }
        }
               
           
       
    }
    public ArrayList<Protokoll> getUebProtListe() {
       
        return uebProtListe;
    }
    public void setUebProtListe(ArrayList<Protokoll> uebProtListe) {
        this.uebProtListe=uebProtListe;
    }



}

In meinem TableModel ist die setValueAt-Methode sehr umfangreich ausstaffiert, da sie einige Aktualisierungen weiterleiten muss.
 
Wieso steht
Java:
meineTabelle.getColumnModel().getColumn(22).setPreferredWidth(100);//sDat
zwischen 3 und 5 und der Vierer ganz unten?

Bei dem Switch kannst du auch durchrutschen lassen.
Java:
       switch (colIndex){
        case 0:
        case 1:
        case 11:
        case 12:
        case 13:
        case 14:
        case 15:
             v= Boolean.class;
             break;
        case 2:
        case 5:
        case 6:
              v=  Integer.class;
              break;
        case 3:
        case 4:
        case 7:
        case 16:
        case 17:
        case 20:
        case 21:
        case 22:
               v=  String.class;
               break;     
        case 8:  
        case 9:
        case 10:
        case 18:
        case 19:
               v=  Double.class;
               break;     
        }
 
Bei dem Switch kannst du auch durchrutschen lassen.

Bei so vielen Fällen ist mir das schon wieder zu lang und umständlich. Da würde ich etwas anderes bevorzugen
Java:
int[] boolColumns = {0, 1, 11, 12, 13, 14, 15};
int[] intColumns = {2, 5};
int[] doublColumns = {8, 9, 10, 18, 19};
int[] stringColumns = {3, 4, 7, 16, 17, 20, 21, 22};

.....

Class<?> v = null;
if(containsColumn(boolColumns, colIndex)) {
   v = Boolean.class;
} else if(containsColumn(intColumns, colIndex)) {
   v = Integer.class;
} else if(containsColumn(doubleColumns, colIndex)) {
   v = Double.class;
} else if(containsColumn(stringColumns, colIndex)) {
   v = String.class;
}

.....

private boolean containsColumn(int[] columnArray, int column) {
   return IntStream.of(columnArray).anyMatch(x -> x == column);
}
(Achtung: habe die Arrays nicht auf Richtigkeit überprüft 😉)

In meinem TableModel ist die setValueAt-Methode sehr umfangreich ausstaffiert, da sie einige Aktualisierungen weiterleiten muss.
Du holst dir am Anfang dieser Methode ein Protokoll Objekt aus deiner Liste heraus. In jedem case hast du dann folgendes stehen uebProtListe.set(rowIndex, Prot);
Diese Zeilen kannst du dir ersparen: Du holst dir ja die Referenz auf diese Objekt aus der Liste. Die Liste selber behält sich ihre Referenz (sprich das Objekt ist immer noch in der Liste).
Alle Änderungen die du nun am Objekt durchführst gelten auch für die Referenz in der Liste, sprich ein erneutes hinzufügen ist unnötig.

Eine weiter "Vereinfachung" wäre mir bei folgenden Zeilen aufgefallen:
Java:
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

Der einzige Unterschied ist die Spalte die du dir holst und die Weite für die Spalte (und das Kommentar).
Java:
int[] preferredWidth = {
   5, 5, 5, 20, 80,
   15, 5, 30, 30, 30,
   40, 5, 5, 5, 5,
   5, 30, 30, 30, 30,
   40, 30, 100 };
   
.....

for(int i = 0; i < preferredWidth.length; i++) {
   meineTabelle.getColumnModel().getColumn(i).setPreferredWidth(preferredWidth[i]);
}
 
Danke euch krqewb und joose,
das sind wirklich gute Verbesserungen, die Zeilen sind beim copypaste wohl durcheinandergeraten. Ich bin allerdings gerade dabei, meine copypaste Technik durch einfaches schreiben zu ersetzen. Danke für den Hinweis.
Die Vereinfachten Codes sind auch prima, da sie meinen Quellcode deutlich übersichtlicher machen und so auch einfacher zu lesen sind.
Joose, dein Ansatz mir die erneute Objektübergabe zu sparen gefällt mir, wenn das Object was ich mir aus der Liste geholt habe, genau das selbe ist, welches noch in der ArrayList liegt.
Prizipiell, könnte ich demanch sicher auch die Objectänderung direkt in der Liste vornehmen und mir so das Herauspicken des Objectes aus der Liste ersparen. Das hätte doch auch Codeersparnis zur Folge, oder ?
 
Ich bin allerdings gerade dabei, meine copypaste Technik durch einfaches schreiben zu ersetzen. Danke für den Hinweis.
Copy&Paste wird immer wieder mal eingesetzt wenn du mal kurz was testen willst. Nur solltest du danach dann eben drüberschauen ob sich sowas nicht vereinfachen lässt bevor du es commitest bzw. so in Produktion übernimmst 😉

Joose, dein Ansatz mir die erneute Objektübergabe zu sparen gefällt mir, wenn das Object was ich mir aus der Liste geholt habe, genau das selbe ist, welches noch in der ArrayList liegt.
Du hast in beiden Fällen nicht das Objekt direkt in der Hand, sondern Referenzen die auf das selbe Objekt im Speicher zeigen 😉

Prizipiell, könnte ich demanch sicher auch die Objectänderung direkt in der Liste vornehmen und mir so das Herauspicken des Objectes aus der Liste ersparen. Das hätte doch auch Codeersparnis zur Folge, oder ?
Könntest du natürlich auch. Die Frage ist dann ob es dadurch vielleicht nicht unleserlicher wird.
In diesem Fall ist es wegen der Performance auch egal (da du immer nur eine Methode aufrufst und fertig). Wenn du aber am selben Objekt mehrere Methoden aufrufe durchführen willst ist es sinnvoller sich 1x das Objekt zu holen, statt jedesmal.
 

Neue Themen


Zurück
Oben