Abstract Table Model

  • Themenstarter Themenstarter Jens
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

Jens

Gast
Hallo,
ich hab folgendes Problem.
Ich hab ein Programm geschrieben und dazu ne GUI erstellt. In der Gui werden einzelne Frames geöffnet und in den Frames werden Tabellen vom Typ Abstract Table Model angezeigt. Die Tabellen werden mit Daten aus ner Datenbank gefüllt.
Jetzt mein genaueres Problem:
Ich möchte die Daten in den Tabellen ändern können.
Ich weiß nur nicht wie ich das machen kann das ich die einzelnen Zellen editieren kann und das auch da stehen bleibt.

Mit der Methode...

Code:
public boolean isCellEditable(int row, int column)
{
    return true;
}

...kann man ja einstellen das die Zellen edititierbar sind. Nur das was ich da eintrage bleibt da nicht stehen. Sobald ich eine andere Zelle selektiere verschwinden meine Änderungen. Ich wollte das dann so haben das die Änderungen stehen bleiben und ich dann nen Button in mein Frame einfüge der die Änderungen im Table dann auch in die Datenbank reinschreibt.
Vielleicht kann mir ja jemand helfen.
Vielen Dank schonmal.
Gruß,
Jens
 
Hi,

Du must zusätzlich die beiden Methoden

Code:
public Object getValueAt(int row, int col)

und

public void setValueAt(Object value, int row, int column)

überschreiben.

Grüße,
Mick
 
dass das nicht dirn stehen bleibt ist mir neu. normalerweise nicht. holst du die daten vielleicht nach jeder änderung wieder neu in die tabelle? ist da irgendein listener der da deine änderungen abfängt oder so? denn dass es wirklich am AbstractTableModel liegt glaub ich nicht...

edit: ahja man lese die API. hm ich hab immer das DefaultTableModel verwendet...
 
Also ich hab im Konstruktor ne trycatch-Anweisung wo ich ein Array mit den Daten aus der Datenbank fülle.
In der getValueAt Methode pack ich dann die einzelnen Datensätze aus dem Array in die Tabelle.
Wie muss ich denn jetzt die setValueAt Methode überschreiben????
Verstehe das nicht so ganz.
 
Beispiel:

Code:
public void setValueAt(Object value, int row, int col) 
    { 
        rowData[row][col] = value; // je nachdem, wie Du Deine Daten hälst
        fireTableCellUpdated(row, col); 
    }

Grüße,
Mick
 
Also die Klasse sieht bis jetzt so aus:
Code:
public class ActInputScreen extends JInternalFrame
{
    UpdateMode[] allUpdateMode;

    JTable table;
    JComboBox combo = new JComboBox();


    public ActInputScreen(Database database)
    {
        super("Aktualisierungs Schlüssel",
              true, //resizable
              true, //closable
              false, //maximizable
              true);//iconifiable);

        try
         {
             // Methode aus DBMUpdateMode wird aufgerufen.
             // Array mit allen Aktualisierungsschlüsseln wird erstellt
             allUpdateMode = new DBMUpdateMode().makeUpdateModes(database);
         }

         catch(Exception e)
         {
             e.printStackTrace();
         }


        // neuer Container für die GUI wird erstellt
        Container contentPane = getContentPane();

        // dem Container wird ein Layout zugeordnet
        contentPane.setLayout(new BoxLayout(contentPane,3));

        // Table Models werden erstellt
        actTable actModel = new actTable();
        JTable act = new JTable(actModel);

        // Scroll Panes werden den Table Models zugeordnet
        contentPane.add(new JScrollPane(act));

        // die Auto-Resize Funktion der JTables wird disabled
        act.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    }


//-----------------------------------------------------------------------------------------------------------

/*
* Table Model für die Tabellen wird erstellt.
* Es werden dabei die ID, der Tabellenname, der Rang und der Aktualisierungsschlüssel angezeigt
*/

    class actTable extends AbstractTableModel
    {
        final String[] columnNames = {"Akk-Schlüssel",
                                      "Kommentar"
                                       };

        public boolean isCellEditable(int row, int column)
        {
            return true;
        }


        public int getColumnCount()
        {
            return columnNames.length;
        }

        public int getRowCount()
        {
            return allUpdateMode.length;
        }

        public String getColumnName(int col)
        {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col)
        {
            switch (col)
            {
                case 0:
                    return allUpdateMode[row].getKey();
                case 1:
                    return allUpdateMode[row].getKommentar();

                default: return null ;
            }

        }

    }
}

Jetzt fehlt mir nur noch die setValueAt Methode. Wie passe ich die denn an???
 
Jens hat gesagt.:
Code:
/*
* Table Model für die Tabellen wird erstellt.
* Es werden dabei die ID, der Tabellenname, der Rang und der Aktualisierungsschlüssel angezeigt
*/

    class actTable extends AbstractTableModel
    {
        final String[] columnNames = {"Akk-Schlüssel",
                                      "Kommentar"
                                       };

        public boolean isCellEditable(int row, int column)
        {
            return true;
        }


        public int getColumnCount()
        {
            return columnNames.length;
        }

        public int getRowCount()
        {
            return allUpdateMode.length;
        }

        public String getColumnName(int col)
        {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col)
        {
            switch (col)
            {
                case 0:
                    return allUpdateMode[row].getKey();
                case 1:
                    return allUpdateMode[row].getKommentar();

                default: return null ;
            }

        }

      public void setValueAt(Object value, int row, int col) 
    { 
        if ( col == 0 ) 
           allUpdateMode[row].setKey(value);
        if ( col == 1 )
           allUpdateMode[row].setKommentar(value);
        fireTableCellUpdated(row, col); 
    } 

}

So in etwa. Falls das nicht klappt, müsste ich wissen, wie allUpdateMode aufgebaut ist, und welche Methoden es bereitstellt.

Grüße,
Mick
 
Vielen Dank.
Es klappt soweit.
Musste nur noch den value-Wert als String casten und dann ging es
Vielen Dank.
Gruß,
Jens
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben