Vectoren

Wyatt

Erfahrenes Mitglied
Heyho...

ich habe eine JTable, deren Daten in einem Vector gespeichert sind u.a. ein Boolean-Wert der in der JTable als Checkbox angezeigt wird...
Wenn das Programm beendet wird, dann wird der Inhalt des Vectors in eine Datei geschrieben und beim starten des Programms wird der Inhalt gelesen und in den Vector geschrieben usw.!

Nun das Problem:
Ich möchte, wenn die Checkbox geändert wird, dass auch der Boolean-Wert im Vector sich ändert...
Leider weiss ich nicht, wie ich das realisieren könnte!

Grüße
Felix

EDIT:
Die Methode habe ich nun selbst fertig, denk ich...
Java:
public void boolchange() {		
		Object[] obj = vector.elementAt(table.getSelectedRow());
		obj[4] = model.getValueAt(table.getSelectedRow(), 4);
		
		System.out.println(model.getValueAt(table.getSelectedRow(), 4));
	}

Wie wende ich die nun immer dann an, wenn der Wert geändert wird!? PropertyChangeListener hat nicht funktioniert...

Grüße
Felix
 
Zuletzt bearbeitet:
Hallo,

du kannst einen ItemStateChangeListener implementieren, also deiner Checkbox hinzufügen und dort dann die Methode aufrufen.

Wenn du nicht mit mehreren Threads arbeitest, die auf den Vector mit den boolean-Werten zugreifen, würde ich dir empfehlen eine ArrayList zu nutzen.

MFG

zEriX
 
Moin!
Wenn ich dich richtig verstehe, nutzt du die CheckBox doch als Renderer bzw. Editor, oder sehe ich das falsch?

D.h. wenn du die Checkbox betätigst oder irgendwie sonst Änderungen an der Table per Hand machst, sollte eigentlich automatisch die setValueAt() Methode deines TableModels aufgerufen werden. Und dort kannst du dann die Änderung speichern.
Aber wenn dein Vecor die Grundlage für die Daten der Tabelle, bzw. dessen Model darstellt sollte das eigentlich automatisch geschehen, sofern du ein DefaultTableModel verwendest..

*grüssle*
MeinerEiner
 
Heyho euch Zwei...
Ihr seid ja heute wieder fleissig am posten :)

Genau Jörg, du hast es richtig verstanden... aber was meinst du genau mit setValueAt() aufrufen? die Methode im Model selbst schreiben?
Also:
Java:
String[] spalten = { "Datum", "Zeit", "Ort", "Person", "Erledigt" };
Object[][] daten = null;

model = new DefaultTableModel(daten,spalten) {	
  public void setValueAt(Object aValue, int row, int column) {
    // code
  }
};
Wenn ja, wie baue ich dann die Funktion ein!?
Ich steh wahrscheinlich gerad total auf dem Schlauch :rolleyes:

Grüße
Felix

EDIT:
Wäre es nicht einfacher, der Column einen Listener zu geben, der bei ändern des Boolean Werts den neuen Wert in den Vector schreibt!?

Grüße
Felix
 
Zuletzt bearbeitet:
Stimmt so geht es auch.

Bei der Methode setValueAt bekommst du als Object die Checkbox, wenn ich mich nicht irre. Da kannst du dann abfragen welchen Status sie hat und mit der Variable row in den Vector speichern.
Hab es jetzt nicht versucht, aber so müsste es funktionieren.

MFG

zEriX
 
Moin!
die setValueAt Methode ist eine Methode des AbstractTableModels und wird im DefaultTablemodel implementiert. Uebergeben bekommt u.a. sie den neuen zu setzenden Wert.
Ich kenne ja die Anforderungen an das Programm nicht, aber wenn du nicht irgendwas special brauchst, musst du eigentlich garnichts weiter tun.. Der Datenvektor wird automatisch auf dem neusten Stand gehalten..
Code:
/*
 * TableTest.java
 *
 * Created on 31. Juli 2007, 15:15
 */

/**
 *
 * @author  joerg weckbach
 */

import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JTable;

import javax.swing.JPanel;

import javax.swing.table.DefaultTableModel;

import javax.swing.DefaultCellEditor;

import javax.swing.JCheckBox;

import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.JScrollPane;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TableTest extends JPanel{
    
    public TableTest(){
            Vector data= new Vector();
            data.add(Boolean.valueOf(true));
            data.add("Test");
            Vector datas = new Vector();
            datas.add(data);
            datas.add(data);
            Vector header = new Vector();
            header.add("1");
            header.add("2");
            DefaultTableModel model = new DefaultTableModel(datas,header){
                public boolean isCellEditable(int row, int column){
                    return true;
                }
                public Class getColumnClass(int columnIndex){
                    if(columnIndex==0)
                        return Boolean.class;
                    else return String.class;
                }
               
            };
            JTable table = new JTable(model);
            table.setDefaultEditor(Boolean.class,new DefaultCellEditor(new JCheckBox()));
            JScrollPane scroll = new JScrollPane();
            scroll.setViewportView(table);
            this.add(scroll);
        }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       JFrame j = new JFrame();
       j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       j.setSize(500,500);
       j.getContentPane().add(new TableTest());
       j.setVisible(true);
       
    }
    
       
    
    
}

*grüssle*
MeinerEiner
 
Das bringt mich schonmal weiter...
Also Ich habe jetzt die setValueAt() Methode selbst implementiert in mein Model
Java:
final String[] spalten = { "Datum", "Zeit", "Ort", "Person", "Erledigt" };
final Object[][] daten = null;
			
model = new DefaultTableModel(daten,spalten) {				
  public Class getColumnClass(int columnIndex) {
    return (columnIndex == 4) ? Boolean.class : String.class;
  }
				
  public boolean isCellEditable(int row, int column) {
    if(table.getColumnName(column) == "Erledigt")
      return true;
    else
      return false;
  }
				
  public void setValueAt(Object aValue, int row, int column) {
    Object[] obj = vector.elementAt(row);
    obj[column] = aValue;
    daten[row][column] = aValue;					
  }
};

soweit so gut...
Nun krieg ich jedoch immer beim klicken der gerenderten Boolean Checkbox eine Exception, obwohl das Feld im Array vorhanden ist...
row hat den Inhalt 0 - column den Inhalt 4 - aValue den Inhalt false

Java:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.Vector.elementAt(Unknown Source)
	at main.HauptView$3.propertyChange(HauptView.java:135)
	at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
	at javax.swing.event.SwingPropertyChangeSupport.firePropertyChange(Unknown Source)
	at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
	at javax.swing.table.TableColumn.firePropertyChange(Unknown Source)
	at javax.swing.table.TableColumn.firePropertyChange(Unknown Source)
	at javax.swing.table.TableColumn.setWidth(Unknown Source)
	at javax.swing.JTable$2.setSizeAt(Unknown Source)
	at javax.swing.JTable$5.setSizeAt(Unknown Source)
	at javax.swing.JTable.adjustSizes(Unknown Source)
	at javax.swing.JTable.adjustSizes(Unknown Source)
	at javax.swing.JTable.setWidthsFromPreferredWidths(Unknown Source)
	at javax.swing.JTable.doLayout(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validate(Unknown Source)
	at java.awt.Window.show(Unknown Source)
	at java.awt.Component.show(Unknown Source)
	at java.awt.Component.setVisible(Unknown Source)
	at java.awt.Window.setVisible(Unknown Source)
	at main.HauptView.initialize(HauptView.java:46)
	at main.HauptView.<init>(HauptView.java:32)
	at start.Main.main(Main.java:13)

Der Vector, der gespeichert wird, habe ich so deklariert:
Java:
private static Vector<Object[]> vector = new Vector<Object[]>();


Liebe Grüße
Felix
 
Wieso erstellst du ein leeres Object[][] Array und weist dies deinem Model zu.
Die Änderungen speicherst du dann in deinem anderen Daten Vector.
Das musst du mir mal erklären..
Das macht überhaupt keinen Sinn!

Die Fehlermeldung kommt nämlich höchstwahrscheinlich aus diesem Grund.

Falls es nicht einen guten Grund gibt, den du bist jetzt noch nicht genannt hast, wirf dieses Object[][] weg und arbeite, wie ich es auch schon 2 mal gesagt habe, mit dem DatenVector.

Zum einen überschreibe die setValueAt Methode, wie du es schon richtig gemacht hast.
Das DefaultTableModel erwartet eigentlich einen Vector von Vectoren. Du hast allerdings einen Vector aus Object[].
Daher musst du auch die getValueAt() Methode überschreiben. Dazu schaue bitte in der Doku!

*grüssle*
MeinerEiner
 
Heyho...

hatte keine zeit bisher wieder zu posten oder mich zu kümmern, erst heut wieder... :)
ich kanns nur so erklären, dass ein Lehrer uns nur diese Art der Tabellenerstellung gezeigt hat (von Vectoren war nie die Rede in seinem Unterricht)...

Nunja... man lernt nie aus, ich habs jetzt hinbekommen!

Danke euch!
Grüße
Felix
 
Zurück