fireTableStructureChanged()

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen

Kann mir jemand bei meinem Problem helfen, wo in Gottes Namen muss ich ein fireTableStructureChanged() platzieren, damit sich die Tabelle bei einer Strukturänderung ändert? Wie funktioniert es?

Ich habe folgendes programmiert, komme aber nicht mehr weiter:

Code:
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableModel;

public class einfacheTabelle {
	
	private static JTextField field1;
	private static String feld1;
	
	public static void Tabelle(Container contentPane) {
		
		GridBagLayout gridBag = new GridBagLayout(); // 3.Schritt
		contentPane.setLayout(gridBag); // 3.Schritt
		GridBagConstraints c = new GridBagConstraints();
		
		
		JButton button1 = new JButton();
		c.gridx = 1;
		c.gridy = 1;
		contentPane.add(button1 , c);
		
		TableModel model = new einfachesTabellenModell(null);
		JTable tabelle = new JTable(model);
		c.gridx = 1;
		c.gridy = 2;
		contentPane.add(tabelle , c);
		
		
		
		field1 = new JTextField(10);
		c.gridx = 1;
		c.gridy = 0;
		contentPane.add(field1 , c);
		
		
		
		ActionListener action1 = new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				
				feld1 = field1.getText();
				einfachesTabellenModell mod = new einfachesTabellenModell(feld1);
				System.out.println(feld1);
				
			}
		};
		button1.addActionListener(action1);
		
	}
	
	 private static void createAndShowGUI() {
	        //Create and set up the window.
	        JFrame frame = new JFrame("DemoFireTable");
	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        
	        //Create and set up the content pane.
	        Tabelle(frame.getContentPane());
	        frame.setSize(800, 789);
	        //Display the window.
	        frame.pack();
	        frame.setVisible(true);
	    }

	    public static void main(String[] args) {
	                createAndShowGUI();
	            }
	        
}

Jetzt das Tabellenmodell:

Code:
import javax.swing.table.AbstractTableModel;

public class einfachesTabellenModell extends AbstractTableModel {

	private static String stringZahl;
	private int zahl;
	
	
	public einfachesTabellenModell(String feld1) {
		
		this.stringZahl = feld1;
		System.out.println(stringZahl);
		fireTableStructureChanged();
	}
	
	
	public int getRowCount() {
		stringZahl = "zwei";
		
		if (stringZahl.equals ("eins")) {
			zahl = 5;
		}
		else
			zahl = 10;
		
		//fireTableStructureChanged();	
		return zahl;
	}

	public int getColumnCount() {
		// TODO Auto-generated method stub
		
		return 10;
	}

	public Object getValueAt(int arg0, int arg1) {
		// TODO Auto-generated method stub
		return null;
		
	}

	
	
}

Ich danke Euch für jede noch so kleine Hilfe...Danke...
 

hupfdule

Top Contributor
In deinem Code: Nirgendwo. Zu keinem Zeitpunkt änderst du etwas an der Struktur. Du stellst nicht einmal Methoden bereit, die das erlauben würden.

Gesetzt dem Fall, dass du eine Methode in EinfachesTabellenModell (Klassen bitte in PascalCase schreiben) hättest:

Code:
public void aendereStruktur(){
  ...
  this.fireTableStructureChanged();
}
dann würdest du es aufrufen, so bald du mit der Änderung fertig bist.

Fallst du aber nicht die Anzahl der Spalten änderst, sondern nur der Zeilen, dann nimm eine der Methoden fireRowXXXXX();
 
G

Guest

Gast
Also ich habe nun einige Änderungen vorgenommen. Wie kann ich nun aber auf die Änderung aufmerksam machen?
Ich habe deine Methode eingebaut, wo muss ich Sie nun aber aufrufen?

Hier der veränderte Code:

Code:
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableModel;

public class EinfacheTabelle1 {
	
	private static JTextField field1;
	private static String feld1;
	
	public static void tabelle(Container contentPane) {
		
		GridBagLayout gridBag = new GridBagLayout(); // 3.Schritt
		contentPane.setLayout(gridBag); // 3.Schritt
		GridBagConstraints c = new GridBagConstraints();
		
		
		JButton button1 = new JButton();
		c.gridx = 1;
		c.gridy = 1;
		contentPane.add(button1 , c);
		
		TableModel model = new EinfachesTabellenModell(null);
		JTable tabelle = new JTable(model);
		c.gridx = 1;
		c.gridy = 2;
		contentPane.add(tabelle , c);
		
		
		
		field1 = new JTextField(10);
		c.gridx = 1;
		c.gridy = 0;
		contentPane.add(field1 , c);
		
		
		
		ActionListener action1 = new ActionListener() {
			public void actionPerformed( ActionEvent e ) {
				
				feld1 = field1.getText();
				EinfachesTabellenModell mod = new EinfachesTabellenModell(feld1);
				System.out.println(feld1);
				[color=red]mod.aendereStruktur();[/color]
			}
		};
		button1.addActionListener(action1);
		
	}
	
	 private static void createAndShowGUI() {
	        //Create and set up the window.
	        JFrame frame = new JFrame("DemoFireTable");
	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        
	        //Create and set up the content pane.
	        tabelle(frame.getContentPane());
	        frame.setSize(800, 789);
	        //Display the window.
	        frame.pack();
	        frame.setVisible(true);
	    }

	    public static void main(String[] args) {
	                createAndShowGUI();
	            }
	        
}

Hier das Tabellemodell:

Code:
import javax.swing.table.AbstractTableModel;

public class EinfachesTabellenModell extends AbstractTableModel {

	private static String stringZahl;
	private int zahl;
	
	
	public EinfachesTabellenModell(String feld1) {
		
		this.stringZahl = feld1;
		System.out.println(stringZahl);
	}
	


	public int getRowCount() {
		[color=red]if (stringZahl == null)
			stringZahl = "eins";[/color]		
		if (stringZahl.equals ("eins")) {
			zahl = 5;
		}
		else
			zahl = 10;
		
		[color=red]aendereStruktur();[/color]		return zahl;
		
	}

	public int getColumnCount() {
		// TODO Auto-generated method stub
		
		return 10;
	}

	public Object getValueAt(int arg0, int arg1) {
		// TODO Auto-generated method stub
		return null;
		
	}
[color=red]
	public void aendereStruktur(){ 
		  this.fireTableRowsUpdated(0, zahl); 
		} [/color]

	
}
 

hupfdule

Top Contributor
Anonymous hat gesagt.:
Ich habe deine Methode eingebaut, wo muss ich Sie nun aber aufrufen?

*lach*

Das war eigentlich nur als abstraktes Beispiel gedacht. Was diese Methode macht und von wo aus sie aufgerufen wird, kannst nur du wissen. Innerhalb dieser Methode machst du irgendwas, was die Struktur deiner Tabelle verändert, also Spalten löscht oder hinzufügt. Erst dann macht das fireTableStructureChanged() doch Sinn.

Gegenfrage: Warum versuchst du diese Methode zu verwenden? In deinem Beispiel benötigst du sie offensichtlich nicht. Nirgendwo änderst du deine Struktur. Beschäftige dich doch erst dann damit, wenn es so weit ist. Und dann wird dir die Funktionsweise sofort einleuchten.
 
G

Guest

Gast
Ok, aber ich ändere Sie doch? Sobald ich im Textfeld "eins" eingebe ändert sich doch die Anzahl der Reihen und deshalb muss ich doch dieses fireTableRowUpdated() aufrufen, oder nicht?

Ich verstehe nicht weshalb ich noch etwas in deiner Methode ändern muss, wenn ich doch die Reihen schon verändert habe, dann muss ich doch nur noch das fireTableRowUpdated() aufrufen, oder?

Kannst Du mir helfen wie es funktioniert, dass was ich hier erstellt habe ist nur ein Beispiel, ich mache zurzeit etwas komplizierteres, stecke aber seit einigen Tagen bei diesem Problem fest, weil ich es nicht verstehe. mmmmhhh...

Besten Dank für deine Hilfe...
 

hupfdule

Top Contributor
*grml*
Hab grad schon einen ellenlangen Text geschrieben und dann schließt mir der scheiß Browser das Fenster. Nur weil ich Ctrl-W gedrückt habe......


Daher jetzt etwas kürzer:

Du erstellst ein neues Model, weist dieses aber der Tabelle nicht zu.

Ein neues Model zu erstellen ist sowieso in der Regel Unsinn. Stattdessen ändert man das vorhandene.

Für dein Beispiel füge dem Model folgende Methode hinzu:
Code:
public void addRow(){
  List<String> newRow= new ArrayList<String>();
  this.rows.add(newRow);
  this.fireTableRowsnserted(this.rows.indexOf(newRow), this.rows.indexOf(newRow));
}

Dir wird auffallen, dass ich hier auf this.rows zugreife, was es bei dir nicht gibt. Und da liegt auch dein größtes Verständnisproblem. Dein Model ist kein Model. Es speichert keine Daten. Dazu ist es aber da. In meinem Beispiel hier gehe ich davon aus, dass du eine List hast, die wiederum List<String> speichert.

Mein Vorschlag. Lies dir erst mal ein Tutorial zu JTable durch. Hier im Forum in der FAQ ist ein sehr gutes. Bei SUN gibts auch eins. Nachdem du beide (oder zumindest eins) gelesen hast, sollte es dir etwas klarer sein.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben