TableModel

Status
Nicht offen für weitere Antworten.

Ocean-Driver

Bekanntes Mitglied
Hallo,


Ich habe eine Tabelle Stunden mit nur einer Spalte. Jetzt würde ich diese gerne mit einer ArrayList<String> füllen.


Jetzt kriege ich diese Liste über eine statische Methode aus der Klasse Tag.getZeitraeume() (Es ist eine statische Methode).

Beim anlegen des TableModels übergebe ich also per Tag.getZeitraeume(); die Daten.

Hier ist das TabellenModell

Code:
package stundenplaner.TableModel;
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class StundenTableModel extends AbstractTableModel{

    private ArrayList<String> stunden;
    
      
    public StundenTableModel(ArrayList<String> stunden)
    {
        this.stunden = stunden;

    }
        //Anzahl der Spalten
	public int getColumnCount() {
		return 1;
	}
        //Anzahl der Datensätze
	public int getRowCount() {
		return stunden.size();
	}

        
        //Spaltenname(n)
     public String getColumnName()
    {
        return "Stunden";
    }

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

    public Object getValueAt(int columnIndex) {
        return stunden.get(columnIndex);
    }
    

    public Object getValueAt(int rowIndex, int columnIndex) {
        return this.getValueAt(columnIndex);
    }
    



}



Und hier erzeuge ich die Tabelle + Modell:


Code:
jTable2 = new javax.swing.JTable();
StundenTableModel STM = new StundenTableModel(Tag.getZeitraeume());
jTable2.setModel(STM);

jTable2.setName("jTable2"); // NOI18N



jScrollPane3.setViewportView(jTable2);




Ich glaube mir ist das mit dem Tabellenmodell noch nicht ganz klar. Was fehlt an dem Model, um es mit den Daten zu füllen? Er füllt jedoch die Tabelle komplett mit dem ersten Eintrag (und das 6x mal --> die ArrayList ist auch 6 Einheiten groß).
 
Code:
    public Object getValueAt(int rowIndex, int columnIndex) {
        return this.getValueAt(columnIndex);
    }

Du beachtest nur columnIndex, also steht in allen Zeilen einer Spalte dasselbe. Versuch es mal mit rowIndex.
 
Hi,


Wie kann ich denn die gerade selektierte Spalte zurückerhalten?

Ich will in der Tabelle editable auf false setzen. Durch auf einen Klick auf einen Button soll die Selektierte Spalte dann freigegeben werden.
 
Hallo,


Ich hab jetzt mal ein einzelnen Datensatz selektet und diesen als Integer abgespeichert. Ich hab mir die variable mal ausgegeben, die Werte liegen alle im gültigen Bereich.
Dann habe ich mit aus der Tabelle den Wert an der Stelle i (aus der Spalte 1) geholt und in nem String gespeichert (getValueAt gibt ein Objekt zurück, was aber 100% ein String ist).

Wenn ich mir den Wert aber speichere, erhalte ich eine ganze Latte von Fehlermeldungen:


Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
at javax.swing.JTable.convertColumnIndexToModel(JTable.java:2496)
at javax.swing.JTable.getValueAt(JTable.java:2638)
at stundenplaner.StundenplanerView.editZeitraumButtonActionPerformed(StundenplanerView.java:373)
at stundenplaner.StundenplanerView.access$1000(StundenplanerView.java:27)
at stundenplaner.StundenplanerView$7.actionPerformed(StundenplanerView.java:316)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Ich weiß nicht woher die ArrayIndexOutOfBoundsException kommen soll, ich stehe keine Index-Überschreitung.


Hier mal mein Quellcode (der der relevant ist):

Code:
        int i = TableZeitraeume.getSelectedRow();
        
        System.out.println(i);
        
        String a = (String) TableZeitraeume.getValueAt(i, 1);
        
        
        TextZeitraum.setText((String)TableZeitraeume.getValueAt(i, 1));


Hier die Methode die den String zurückliefert:
Code:
    public Object getValueAt(int rowIndex, int columnIndex) { 
               return stunden.get(rowIndex); 
    }
 
Code:
String a = (String) TableZeitraeume.getValueAt(i, 1);

Der kleinste Index eines Arrays ist in Java 0. Rate mal was der kleinste Index bei einem TableModel ist.
 
Wenn ich ein Feld bearbeite, und die JTable dann aktularisiere will,
male ich die Table einfach mit repaint(); neu,oder setzte ich den Wert in der Tabelle einfach direkt auf den aus dem TextField?

Was ist die gängiere Methode?
 
Die gängige Methode ist, dass das TableModel ein TableModelEvent abfeuert (an seine TableModelListener schickt). Das AbstractTableModel hat dazu einige "fireXYZ"-Methoden, die das für dich machen können.
 
Also syntaktisch müsste man doch den TableModelListener aufrufen und diesem das TableModelEvent vom TableModel zuschicken.

richtig?


Nur, wenn ich mir das Model über TblZeitraeume.getModel(); hole, kriege ich keine fire methode?
 
Wer ist für den Inhalt des Models verantwortlich, wer kennt den Inhalt des Models? Das Model selbst!
D.h. das Model sollte die Events selber verschicken, das sollte man nicht "von aussen" aufrufen.

Dein "StundenplanModel" hat da ja eine Methode "setValueAt". Diese Methode wird von der JTable aufgerufen, wenn man eine Zelle editiert hat. Und da kannst du dann auch gleich der Aufruf für "fire..." machen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben