Class übergreifend JPanel aktualisieren

Hallo Marco,

hier mal kleines Beispiel wie man Zeilen hinzufügen und löschen kann. Je nach wie das JTable aufgebaut wurde könnte die Lösung anders aussehen. Hab hier mal ein DefaultTableModel verwendet.

Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TableUpdateExample extends JFrame implements ActionListener {

	private DefaultTableModel dtm = new DefaultTableModel(3,2);

	private JTable table = new JTable(dtm);

	private JPanel p = new JPanel();

	private JTextField t1 = new JTextField();

	private JTextField t2 = new JTextField();

	private JButton b1 = new JButton("Füge neue Zeile ein");

	private JButton b2 = new JButton("Lösche markierte Zeile");

	public TableUpdateExample() {
		super("TableExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		p.setLayout(new GridLayout(3, 2));
		p.add(new JLabel("Name:"));
		p.add(t1);
		p.add(new JLabel("Tel. Nr:"));
		p.add(t2);
		p.add(b1);
		p.add(b2);

		createTable();
		
		this.add(p, BorderLayout.NORTH);
		this.add(new JScrollPane(table), BorderLayout.CENTER);

		this.pack();
		this.setVisible(true);

		b1.addActionListener(this);
		b2.addActionListener(this);
	}

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

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == b1)
			updateTable();
		else
			deleteRow();
	}

	public void updateTable() {
		if (t1.getText() != null && t1.getText().length() > 0
				&& t2.getText() != null && t2.getText().length() > 0) {
			dtm.addRow(new String[] { t1.getText(), t2.getText() });
			dtm.fireTableDataChanged();
			dtm.fireTableStructureChanged();
			t1.setText("");
			t2.setText("");
		}
	}

	public void deleteRow() {
		if (table.getSelectedRow() != -1) {
			dtm.removeRow(table.getSelectedRow());
			dtm.fireTableDataChanged();
			dtm.fireTableStructureChanged();
		}
	}

	public void createTable() {
		dtm.setValueAt("Hans",0,0);
		dtm.setValueAt("12345",0,1);
		dtm.setValueAt("Peter",1,0);
		dtm.setValueAt("67890",1,1);
		dtm.setValueAt("Klaus",2,0);
		dtm.setValueAt("10293",2,1);
	}
}


Vg Erdal
 
Das hilft mir schon mal etwas weiter.
Muss ich mir aber erstmal noch genauer anschauen.

Dank dir! :D
 
Funktioniert leider nicht so wie ich es gerne hätte ;_;

Gibt es denn keine lösung das die Tabelle einfach komplet gelöscht wird und bei drücken des Buttons wieder komplet neu eingelesen wird?
 
Hallo Marco,

schau mal hier:

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TableRefreshExample extends JFrame implements ActionListener {

	private JTable table = new JTable();

	private JButton b = new JButton("Refresh Table");

	public TableRefreshExample() {
		super("TableExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		
		refreshTable();
		
		this.add(b, BorderLayout.SOUTH);
		this.add(new JScrollPane(table), BorderLayout.CENTER);

		this.pack();
		this.setVisible(true);
		
		b.addActionListener(this);
	}

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

	public void actionPerformed(ActionEvent e) {
		refreshTable();
	}

	public void refreshTable() {
		DefaultTableModel dtm = new DefaultTableModel(0, 2);

		Scanner scan = null;
		try {
			scan = new Scanner(new File("telregister.txt"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		String temp = "";
		String name = "";
		String tel = "";

		while (scan.hasNextLine()) {
			temp = scan.nextLine();
			name = temp.substring(0, temp.indexOf("/"));
			tel = temp.substring(temp.indexOf("/") + 1, temp.length());
			dtm.addRow(new String[] { name, tel });
		}
		scan.close();
		dtm.fireTableDataChanged();
		dtm.fireTableStructureChanged();
		table.setModel(dtm);
		table.updateUI();
	}
}

telregister.txt
Code:
Hans/12345
Peter/98765
Klaus/45678
Marco/67895


Vg Erdal
 
Hallo Marco,

mein letzter Vorschlag wäre folgendes:
Code:
public void aktualisieretabelle(){
mytable.setModel(new MyModel());
mytable.updateUI();
}
da du ein eigenes Model verwendest, in welchem die Daten angefordert und eingelesen werden. Müsste es zum aktualisieren der Tabelle, d.h. neueinlesen der Daten aus einer Datei und anzeigen, reichen ein neues Model zu erzeugen und diese der Tabelle zu übergeben. Somit wären die alten Daten verworfen, und die neuen Daten eingelesen. Mit updateUI() müsste dann auch die Anzeige aktualisiert sein.


Vg Erdal
 
Ich muss leider Aufgeben ;_;
Die Zeit wird mir zu knapp.
Hab jetzt damit schon über eine Woche verbracht.

Dennoch vielen Dank für deine Mühe.
 
Zurück