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.
 

Thallius

Top Contributor
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
 

MARJAVA

Aktives Mitglied
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.
 

MARJAVA

Aktives Mitglied
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.
 

krgewb

Top Contributor
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;     
        }
 

Joose

Top Contributor
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]);
}
 

MARJAVA

Aktives Mitglied
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 ?
 

Joose

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
_user_q Wie den Inhalt vom Spinner auf Integer überprüfen? AWT, Swing, JavaFX & SWT 15
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
H JTabel Inhalt löschen AWT, Swing, JavaFX & SWT 1
L JDialog hat manchmal keinen Inhalt AWT, Swing, JavaFX & SWT 2
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
ZH1896ZH JavaFX Wie kann ich die Fenstergrösse entsprechend dem Inhalt vergrössern/verkleinern AWT, Swing, JavaFX & SWT 2
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
L JavaFX Pane inklusive Inhalt der Bildschirm Auflösung anpassen AWT, Swing, JavaFX & SWT 13
Hatsi09 JTextArea Inhalt verlinken AWT, Swing, JavaFX & SWT 4
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
A Inhalt wechseln bei Klick auf Label AWT, Swing, JavaFX & SWT 8
C JTextField Inhalt mit Maus selektieren wenn disabled AWT, Swing, JavaFX & SWT 2
C JavaFX ProGuard -> TableView kein Inhalt AWT, Swing, JavaFX & SWT 7
D Inhalt von JTextField in MySQL speichern. Wie ? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
T [Neuling] Textfeld Inhalt überprüfen und falsche Stellen als msg Ausgeben AWT, Swing, JavaFX & SWT 1
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
gamillton Swing JComboBox mit extra Inhalt + breiteres Popupmenü AWT, Swing, JavaFX & SWT 0
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
G Menübar anklicken und Inhalt entsprechend wechseln AWT, Swing, JavaFX & SWT 4
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
A JavaFX Von Klasse auf Controller Inhalt zugreifen AWT, Swing, JavaFX & SWT 9
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
A BorderLayout "Center" Inhalt wechseln AWT, Swing, JavaFX & SWT 1
D Swing JTable mit Inhalt aus XML-File AWT, Swing, JavaFX & SWT 3
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
E JavaFX JavaFX - MenuItem erstellen aus dem Inhalt einer HashMap AWT, Swing, JavaFX & SWT 1
Z JavaFX Inhalt einer ViewTable durch Aktion einer Menubar ändern welche in einer anderen fxml ist AWT, Swing, JavaFX & SWT 4
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
E JavaFX Sehr viel und unterschiedlich Großen Inhalt auf einer "Fläche" ... Umsetzbar ? AWT, Swing, JavaFX & SWT 3
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
JAVAnnik JavaFX Inhalt der TreeCell nicht einrücken AWT, Swing, JavaFX & SWT 1
F AWT Drucken verschluckt inhalt AWT, Swing, JavaFX & SWT 1
S Inhalt der Java-Konsole in die JTextArea AWT, Swing, JavaFX & SWT 3
TheJavaKid JTextField: Reine Domain herausfiltern, sonst Inhalt löschen AWT, Swing, JavaFX & SWT 1
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
OnDemand Inhalt des Frames ändern AWT, Swing, JavaFX & SWT 4
S SWT TableCell mit Composite als Inhalt / Höhe der Cell/Row AWT, Swing, JavaFX & SWT 5
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
C Swing Anzeigeproblem mit TableModels abhängig von deren Inhalt AWT, Swing, JavaFX & SWT 10
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
I JTable Spalten automatisch dem Inhalt anpassen! AWT, Swing, JavaFX & SWT 6
P Swing Dialog zeigt keinen Inhalt in Verbindung mit JFrame AWT, Swing, JavaFX & SWT 18
0 JTable Spaltenbreite automatisch an Inhalt anpassne geht nicht AWT, Swing, JavaFX & SWT 3
M EditorPane Inhalt anders als er soll! AWT, Swing, JavaFX & SWT 2
S Swing JFormattedTextField - bei nicht korrekter Eingabe Inhalt überschreiben AWT, Swing, JavaFX & SWT 5
S Swing JFormattedTextfield markiert nicht gesamten Inhalt AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
N Swing JCombobox - PopupMenu-Inhalt mit KSKB AWT, Swing, JavaFX & SWT 2
N Swing KomponentenHöhe an html-Inhalt anpassen AWT, Swing, JavaFX & SWT 4
S Inhalt einer JComboBox aktualisieren AWT, Swing, JavaFX & SWT 6
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8
N Fehler Inhalt von JTable wird gelöscht AWT, Swing, JavaFX & SWT 5
C SWT Wie greife ich auf den Inhalt einer bestimmten Zeile zu? (TableViewer) AWT, Swing, JavaFX & SWT 7
H JFrame Inhalt neu aufbauen? AWT, Swing, JavaFX & SWT 8
M Beim Start von TableEditor Inhalt der Zelle markieren. AWT, Swing, JavaFX & SWT 2
T Inhalt von einem Tab an JTabbedPane größe ausrichten? AWT, Swing, JavaFX & SWT 2
TheWhiteShadow JList-Inhalt nach Änderung weg AWT, Swing, JavaFX & SWT 3
P Swing JScrollPane-Inhalt: Grösse anpassen AWT, Swing, JavaFX & SWT 6
0 JFrame zeigt Inhalt erst nach vergrößern an AWT, Swing, JavaFX & SWT 3
P AWT Wie kann mein listener den Inhalt eines anderen Textfelds ändern? AWT, Swing, JavaFX & SWT 10
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
A Swing JScrollPane zeigt keinerlei Inhalt an AWT, Swing, JavaFX & SWT 2
H Swing JPanel Inhalt wird bei verwenden von JPopup gelöscht AWT, Swing, JavaFX & SWT 5
C SWT Textfeld mit festem und variablen Inhalt AWT, Swing, JavaFX & SWT 13
X Swing JTable stets mit gleichem Inhalt öffnen AWT, Swing, JavaFX & SWT 3
O JTable mit Inhalt drucken AWT, Swing, JavaFX & SWT 3
L Inhalt einer table löschen AWT, Swing, JavaFX & SWT 2
C Swing Inhalt einer JTable aktualisieren und filten nach Feldern die nicht in der Tabelle sind AWT, Swing, JavaFX & SWT 3
lumo SWT ScrolledComposite maximierter inhalt AWT, Swing, JavaFX & SWT 2
K Tabellen Inhalt ( Zelle ) Modifizieren AWT, Swing, JavaFX & SWT 2
H Swing HTML in einem JEditorPane zeilenweise hinzufügen ohne Inhalt jedes Mal neu zu laden AWT, Swing, JavaFX & SWT 4
D Transparentes JFrame mit inhalt AWT, Swing, JavaFX & SWT 7
S Swing JTabbedPane: Inhalt soll oben links anfangen AWT, Swing, JavaFX & SWT 6
O Swing Inhalt des JFrames wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
0 2D-Grafik Screenshot von ScrollBar-Inhalt AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
C Swing JTable zeigt in jeder Zelle einer Reihe denselben Inhalt AWT, Swing, JavaFX & SWT 2
B Inhalt eines ScrolledComposite ändern AWT, Swing, JavaFX & SWT 5
M Swing jList Inhalt neu anzeigen AWT, Swing, JavaFX & SWT 6
S Swing Inhalt eines Fenster bei Größenänderung anpassen (GroupLayout) AWT, Swing, JavaFX & SWT 2
C Swing Inhalt eines JPanels ermitteln & bearbeiten AWT, Swing, JavaFX & SWT 5
G LayoutManager per Button GridBagLayout + Inhalt ändern AWT, Swing, JavaFX & SWT 2
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
M Inhalt aus TextArea verarbeiten AWT, Swing, JavaFX & SWT 4
Z Swing Inhalt von JScrollPane wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben