JTable Größe verändert sich?

Hallo Leute,
Ich habe eine JTable, befülle diese mit meinen Daten, setze Renderer, der nichts tut außer verschiedene Farben für die verschiedenen Columns zu vergeben.

Aber komischerweise tritt immer ein Fehler bei der jTable auf, dann wird die jTable kleiner als das JScrollpane und man kann die jTable nicht mehr anklicken, solange man nicht wieder die Größe des letzten Columns wiederherstellt.

Schwierig das alles zu erklären besser ist ein Bild:
Ohne Fehler:

Uploaded with ImageShack.us

Mit Fehler:

Uploaded with ImageShack.us

Ich habe leider keinen Anhaltspunkt woran es überhaupt liegen könnte?!?
Mein Renderer ändert nie irgendwo eine Größe einer Column.
Mein DefaultTableModel ändert auch keine Größen.

So, ein Richtungstipp könnte ich sehr gebrauchen

Danke sehr

Was heisst immer? Wann tritt der Fehler auf? Gleich zu Beginn, wenn die Tabelle dargerstellt/angezeigt wird? Oder wenn neue Daten in der Tabelle angezeigt werden?

dann wird die jTable kleiner als das JScrollpane und man kann die jTable nicht mehr anklicken, solange man nicht wieder die Größe des letzten Columns wiederherstellt.

Das mit dem „nicht anklcken können“ hab ich auch noch nicht verstanden. Was bedeutet das, man kan die Tabelle nicht anklicken? Und wie stellst du dir Grösse des letzten Columns wieder her? Verschieben der Header?

Vielleicht musst du auch mal den Java-Code zur Tabelle zeigen.

Setz halt mal in der TableColumn-Klasse nen Breakpoint wo die Breite gesetzt wird und schau wo der Aufruf her kommt wenn der Fehler wieder auftritt.

Stimmt zu wenig erklärt:
Der Fehler kommt zufällig, ich habe noch nichts erkennen können, dass es immer nach etwas genauem Auftritt. Ich klicke halt die jComboboxen oder den Booleanwert an, oder versuche (verschieben funktioniert zwar nicht, aber ich tu einfach so) die JComboboxen zu verschieben.

Und irgendwann plötzlich, kommt der Fehler.

[QUOTE=Camino;27198]
Das mit dem „nicht anklcken können“ hab ich auch noch nicht verstanden. Was bedeutet das, man kan die Tabelle nicht anklicken? Und wie stellst du dir Grösse des letzten Columns wieder her? Verschieben der Header? [/QUOTE]

„nicht anklicken können“ heißt, dass wenn ich auf meine jComboboxen drücke, nichts passiert. (Ich kann auch nicht den Booleanwert anklicken. Normalerweise kommt eine Auswahlliste bei den jComboboxen wo man Werte auswählen kann, es passiert aber nichts, es „springt“ nicht mal die Methode „isCellEditable“ von meiner DefaultTableModel an. Wenn sich die Tabelle verschoben hat, kann man erst die jComboboxen wieder anklicken, also so, dass die Auswahlliste wieder erscheint, wenn man die Größe der Columns wiederherstellt.

Was heißt jetzt Columns wiederherstellen: Ich verschiebe die Header,sodass die JScrollpane einfach wieder voll ist, also normalzustand hergestellt ist.

[QUOTE=Camino;27198]
Vielleicht musst du auch mal den Java-Code zur Tabelle zeigen.[/QUOTE]

Hier der Java-Code für die jTable:
TableModel

                    implements javax.swing.event.TableModelListener  {

    private Controller controller;
    String[] COL_IDENTIFIER_Statistik = 
        {"Wertungsklasse","Gesamt","Mini","Kinder","Junioren1","Junioren2",
            "AllgK","Einheitlich"};
    
    public StatistikRunde1_TableModel(Controller controller,Object[][] data) {
        this.controller = controller;       
        
        setDataVector(data, COL_IDENTIFIER_Statistik);
        this.addTableModelListener(this);
    }

    @Override
    public Object getValueAt(int row, int column) {
        return super.getValueAt(row, column);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if(columnIndex == 7)
            return Boolean.class;
        return super.getColumnClass(columnIndex);
    }        

    @Override
    public boolean isCellEditable(int row, int column) {
        controller.getModel().setRunde_Statistik(1);
        int temp = controller.getModel().getWelchejRadioButtonAngeklickt();

        /*if(controller.getModel().getWelchejRadioButtonAngeklickt() > 2)
        {
            return false;
        }else
        {
            if(getValueAt(row, 7).toString().equals("true"))
            {
                //Darf nur Gesamt und Einheitlich verändern
                return column == 1 || column == 7;
            }else
            {
                boolean temp2 = column > 1;
                return column > 1;
            }            
        }*/
        return true;
    }

    @Override
    public void tableChanged(TableModelEvent e) {       
        int row = e.getFirstRow();
        int column = e.getColumn();

        TableModel model = (TableModel)e.getSource();
        //String columnName = model.getColumnName(column);
        String wertungsname = String.valueOf(model.getValueAt(row, 0));
        Object wert = model.getValueAt(row, column);

        Object[][] faktoren;

        controller.getModel().setRunde_Statistik(1);
        
        faktoren = controller.getModel().getDisziplinFaktorenEineWertungsklasse();
        for(int i=0; i<faktoren.length; i++)
        {
            if(faktoren**[0].toString().equals(wertungsname))
            {
                if(column == 1)
                {
                    //Gesamt
                    faktoren**[1] = wert;
                    faktoren**[2] = wert;
                    faktoren**[3] = wert;
                    faktoren**[4] = wert;
                    faktoren**[5] = wert;
                    faktoren**[6] = wert;
                    break;
                }else
                {
                    faktoren**[column] = wert;
                    break;
                }
            }
        }
        
        //hier wird nur ein wert gesetzt
        controller.getModel().setDisziplinFaktorenEineWertungsklasse(faktoren);
        //Hier wird das TableModel mit den neuen Werten (faktoren[][]) gespeichert
        controller.getModel().setDtmStatistikRunde1();
        //d.h. new TableModel und dann jTable.setModel(mit neuem TableModel)

        //Hier werden noch externe berechnungen, nichts bezüglich jTable gemacht
        controller.getControllerHauptform().verwalte_refreshstatistik("");
    }
    
}```

Renderer:
```public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
  public MyComboBoxRenderer(String[] items) {
    super(items);
  }

  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {

      //mal ausprobieren updateUI();
    if(table.getValueAt(row, 7) == true)
    {
        if(column == 1)
        {
          setForeground(Color.BLACK);
          setBackground(Color.WHITE);              
        }else
        {
          setForeground(Color.GRAY.brighter());
          setBackground(Color.white);
        }
    }else
    {
        if(column == 1)
        {
          setForeground(Color.GRAY.brighter());   
          setBackground(Color.white);
        }else
        {
          setForeground(Color.BLACK);
          setBackground(Color.WHITE);             
        }          
    }
    setSelectedItem(value);
    return this;
  }
}```

Setzten der JTable:
```            jTable_StatistikRunde1.setModel(
                    controller.getModel().getDtmStatistikRunde1());
            for(int z=1; z<=6; z++)
            {
                TableColumn eineColumn = jTable_StatistikRunde1
                        .getColumnModel().getColumn(z);
                JComboBox comboBox = new JComboBox();
                String[] faktoren = controller.getModel().getFaktorenFuerJCombobox();
                
                for(String einFaktor : faktoren)
                {
                    comboBox.addItem(einFaktor);
                }
                eineColumn.setCellEditor(new DefaultCellEditor(comboBox));
                eineColumn.setCellRenderer(new MyComboBoxRenderer(faktoren));
            } ```

So, was mich daran so fertig macht ist, dass ich nirgends die Größe/Width der Columns ändere, deshalb hab ich keinen Ansatzpunkt, wo der Fehler sein könnte?!?