Swing JTable durchsuchen

Hallo zusammen

In einem Java Programm von mir habe ich ein Problem, welches ich bisher nicht lösen konnte und hoffe auf Eure Hilfe.

Ich habe ein Programm erstellt, welches Adressen in einer Textdatei verwaltet. Wenn ich eine Adressdatenbank (maximal 4 verschiedene Adressdatenbanken können erstellt werden), und diese nach einem Begriff durchsuchen lassen will, passiert nichts und es wird nicht nach dem Begriff gesucht. Ich vermute es liegt daran, dass ich den TableRowSorter falsch verwende oder verwendet habe.

Kann mir jemand von Euch helfen wie ich das lösen kann/muss?

Grüsse
Bruno

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.PatternSyntaxException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class MyAdressDatabase extends javax.swing.JFrame {

 public MyAdressDatabase() {
 initComponents();
 }

 private void initComponents() {

 final TableRowSorter sorter = new TableRowSorter (); 

 jLabel1 = new javax.swing.JLabel();
 jComboBox1 = new javax.swing.JComboBox();
 jInternalFrame1 = new javax.swing.JInternalFrame();
 jScrollPane1 = new javax.swing.JScrollPane();
 jTable1 = new javax.swing.JTable();
 loadTableButton = new javax.swing.JButton();
 delRowButton = new javax.swing.JButton();
 searchTableButton = new javax.swing.JButton();
 suchLabel = new javax.swing.JLabel();
 suchText = new javax.swing.JTextField();
 jTable1 = new javax.swing.JTable();

 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT\_ON\_CLOSE);
 setTitle("MAD MeineAdressenDatenbank");

 jLabel1.setText("Adressdatenbank");
 suchText.setText("SuchText");
 suchLabel.setText("Suchbegriff");
 loadTableButton.setText("Neue Adresse");
 delRowButton.setText("Zeile löschen");
 searchTableButton.setText("Suchen");
 jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Adressdatenbank 1", "Adressdatenbank 2", "Adressdatenbank 4", "Adressdatenbank 5" }));

 delRowButton.addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(java.awt.event.ActionEvent evt) {
 delRowButtonActionPerformed(evt);
 }

 private void delRowButtonActionPerformed(java.awt.event.ActionEvent evt) 
 {
 int zeile = jTable1.getSelectedRow(), spalte = 0;
 TableCellEditor cellEditor = jTable1.getCellEditor();
 boolean stopped = true;
 if (cellEditor != null) {
 stopped = cellEditor.stopCellEditing();
 }
 if (zeile ==-1) {
 JOptionPane.showMessageDialog(null,
 "Keine Zeile ausgewählt", "Fehlermeldung",
 JOptionPane.ERROR\_MESSAGE);
 } else {
 if (stopped) {
 DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
 dtm.removeRow(zeile);
 } }
 }
 });

 searchTableButton.addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(java.awt.event.ActionEvent evt) {
 System.out.println("\*\*\*\*\*SUCHEN\*\*\*\*");
 suchTextActionPerformed(evt);
 }

 private void suchTextActionPerformed(ActionEvent evt) {
 String text = suchText.getText () ; 
 System.out.println("\*\*\*SUCHEN:\*\*\*"+text);
 if ( text.length () == 0 ) {sorter.setRowFilter ( null ); 
 } else { 
 System.out.println(sorter);
 try {sorter.setRowFilter (RowFilter.regexFilter ( text )); 
 } catch ( PatternSyntaxException pse ) { 
 System.err.println ( "Bad regex pattern" ) ; 
 } 
 } 
 } 
 });

 jComboBox1.addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(java.awt.event.ActionEvent evt) {
 jComboBox1ActionPerformed(evt);
 loadTableButtonActionPerformed(evt);
 }

 private void loadTableButtonActionPerformed(java.awt.event.ActionEvent evt) 
 {
 DefaultTableModel deft=(DefaultTableModel)jTable1.getModel();
 String selectedItem = (String)jComboBox1.getSelectedItem();
 String Adressdatei = "D:/"+selectedItem+".txt";
 try
 {
 FileReader fr=new FileReader(Adressdatei);
 BufferedReader br=new BufferedReader(fr);
 String zeile;
 while((zeile=br.readLine())!=null)
 {
 String[] teile=zeile.split("#");
 deft.addRow(new Object[]{teile[0],teile[1],teile[2],teile[3],});
 }
 fr.close();
 }
 catch(Exception e)
 {
 JOptionPane.showMessageDialog(null,
 "Fehler: "+e.getMessage(), "Fehlermeldung",
 JOptionPane.ERROR\_MESSAGE);
 }
 }


 private void jComboBox1ActionPerformed(ActionEvent evt) {
 String selectedItem = (String)jComboBox1.getSelectedItem();
 JOptionPane.showMessageDialog(
 null,"Ihre Wahl: " + selectedItem, "Information",
 JOptionPane.INFORMATION\_MESSAGE);
 }
 });
 
 jTable1.setAutoCreateRowSorter(true);
 jTable1.setRowSorter (sorter) ; 
 jTable1.setAutoResizeMode(javax.swing.JTable.AUTO\_RESIZE\_ALL\_COLUMNS);
 jScrollPane1.setViewportView(jTable1);

 jTable1.setModel(new javax.swing.table.DefaultTableModel(
 new Object [][] {},
 new String [] {
 "Name", "Vorname", "Strasse", "Ort"
 }
 ));

 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

 getContentPane().setLayout(layout);
 layout.setHorizontalGroup(
 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 .addGroup(layout.createSequentialGroup()
 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 .addContainerGap()
 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT\_SIZE, 615, Short.MAX\_VALUE)
 .addComponent(jComboBox1, 0, 615, Short.MAX\_VALUE)))
 .addGroup(layout.createSequentialGroup()
 .addGap(20, 20, 20)
 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT\_SIZE, 607, Short.MAX\_VALUE))
 .addGroup(layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(delRowButton, javax.swing.GroupLayout.PREFERRED\_SIZE, javax.swing.GroupLayout.DEFAULT\_SIZE, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 74, Short.MAX\_VALUE)
 .addComponent(searchTableButton)
 .addGap(58, 58, 58)
 .addComponent(loadTableButton, javax.swing.GroupLayout.PREFERRED\_SIZE, 164, javax.swing.GroupLayout.PREFERRED\_SIZE))
 .addGroup(layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(suchText, javax.swing.GroupLayout.DEFAULT\_SIZE, 615, Short.MAX\_VALUE))
 .addGroup(layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(suchLabel, javax.swing.GroupLayout.DEFAULT\_SIZE, 615, Short.MAX\_VALUE)))
 .addContainerGap())
 );
 layout.setVerticalGroup(
 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 .addGroup(layout.createSequentialGroup()
 .addGap(27, 27, 27)
 .addComponent(jLabel1)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED\_SIZE, javax.swing.GroupLayout.DEFAULT\_SIZE, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(suchLabel)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(suchText, javax.swing.GroupLayout.PREFERRED\_SIZE, javax.swing.GroupLayout.DEFAULT\_SIZE, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addGap(51, 51, 51)
 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED\_SIZE, 108, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addGap(49, 49, 49)
 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 .addComponent(delRowButton, javax.swing.GroupLayout.PREFERRED\_SIZE, javax.swing.GroupLayout.DEFAULT\_SIZE, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 .addComponent(loadTableButton)
 .addComponent(searchTableButton)))
 .addGap(57, 57, 57))
 );

 pack();
 }

 public static void main(String args[]) {
 java.awt.EventQueue.invokeLater(new Runnable() {
 public void run() {
 new MyAdressDatabase().setVisible(true);
 }
 });
 }

 private javax.swing.JButton loadTableButton;
 private javax.swing.JButton searchTableButton;
 private javax.swing.JButton delRowButton;
 private javax.swing.JComboBox jComboBox1;
 private javax.swing.JInternalFrame jInternalFrame1;
 private javax.swing.JLabel jLabel1;
 private javax.swing.JLabel suchLabel;
 private javax.swing.JTextField suchText;
 private javax.swing.JScrollPane jScrollPane1;
 private javax.swing.JTable jTable1;

}

Hi Bruno,

das entscheidende ist, dass dem Sorter das Model bekannt sein muss.
Dabei muss es dasselbe Objekt sein, das die JTable als model hat. Es darf also nicht nur die gleiche Klasse sein, sondern es muss tatsächlich das gleiche Objekt sein.
Außerdem würden bei Deinem Code ständig neue Einträge hinzugefügt, selbst wenn Du nur die Datei wechselt.
Ich habe Deinen Code etwas angepasst. Sieh ihn Dir an und melde Dich, wenn Dir etwas unklar sein sollte.

Gruß, Stephan

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.regex.PatternSyntaxException;

import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.RowFilter;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class MyAdressDatabase extends JFrame {

 /\*\*
 \* Simple model class
 \*
 \*/
 private class MyModel extends DefaultTableModel {
 /\*\*
 \* 
 \*/

 private MyModel(Object[][] data, Object[] columnNames) {
 super(data, columnNames);
 }

 public Class getColumnClass(int column) {
 Class returnValue;
 if ((column \>= 0) && (column (model);

 jTable1.setModel(model);
 loadTableButton.addActionListener(new ActionListener() {

 @Override
 public void actionPerformed(ActionEvent e) {

 }
 });
 delRowButton.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent evt) {
 delRowButtonActionPerformed(evt);
 }

 private void delRowButtonActionPerformed(ActionEvent evt) {
 int zeile = jTable1.getSelectedRow(), spalte = 0;
 TableCellEditor cellEditor = jTable1.getCellEditor();
 boolean stopped = true;
 if (cellEditor != null) {
 stopped = cellEditor.stopCellEditing();
 }
 if (zeile == -1) {
 JOptionPane.showMessageDialog(null,
 "Keine Zeile ausgewählt", "Fehlermeldung",
 JOptionPane.ERROR\_MESSAGE);
 } else {
 if (stopped) {
 DefaultTableModel dtm = (DefaultTableModel) jTable1
 .getModel();
 dtm.removeRow(zeile);
 }
 }
 }
 });

 searchTableButton
 .addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(ActionEvent evt) {
 suchTextActionPerformed(evt);
 }

 private void suchTextActionPerformed(ActionEvent evt) {
 String text = suchText.getText();
 System.out.println("\*\*\*SUCHEN:\*\*\*" + text);
 if (text.length() == 0) {
 sorter.setRowFilter(null);
 } else {
 System.out.println(sorter);
 try {
 sorter.setRowFilter(RowFilter.regexFilter(text, 0));
 } catch (PatternSyntaxException pse) {
 System.err.println("Bad regex pattern");
 }
 }
 }
 });

 jComboBox1.addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(ActionEvent evt) {
 jComboBox1ActionPerformed(evt);
 loadTableButtonActionPerformed(evt);
 }

 private void loadTableButtonActionPerformed(ActionEvent evt) {
 String selectedItem = (String) jComboBox1.getSelectedItem();
 /\* 
 \* build path to file 
 \*/
 String Adressdatei = "D:/" + selectedItem + ".txt";
 DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
 /\*
 \* remove all entries
 \*/
 int rowcount = model.getRowCount();
 for (int i = rowcount; i \> 0; i--) {
 model.removeRow(i-1);
 }
 /\*
 \* get new model data by passing the file
 \*/
 Object[][] rows = getNewModel(new File(Adressdatei));
 /\*
 \* set new entries to the model
 \*/
 model.setDataVector(rows, columns);
 }

 private void jComboBox1ActionPerformed(ActionEvent evt) {
 String selectedItem = (String) jComboBox1.getSelectedItem();
 JOptionPane.showMessageDialog(null, "Ihre Wahl: "
 + selectedItem, "Information",
 JOptionPane.INFORMATION\_MESSAGE);
 }
 });

 jTable1.setAutoCreateRowSorter(true);
 jTable1.setRowSorter(sorter);
 jTable1.setAutoResizeMode(JTable.AUTO\_RESIZE\_ALL\_COLUMNS);
 jScrollPane1.setViewportView(jTable1);

 GroupLayout layout = new GroupLayout(getContentPane());

 getContentPane().setLayout(layout);
 layout.setHorizontalGroup(layout
 .createParallelGroup(GroupLayout.Alignment.LEADING)
 .addGroup(
 layout.createSequentialGroup()
 .addGroup(
 layout.createParallelGroup(
 GroupLayout.Alignment.LEADING)
 .addGroup(
 GroupLayout.Alignment.TRAILING,
 layout.createSequentialGroup()
 .addContainerGap()
 .addGroup(
 layout.createParallelGroup(
 GroupLayout.Alignment.TRAILING)
 .addComponent(
 jLabel1,
 GroupLayout.Alignment.LEADING,
 GroupLayout.DEFAULT\_SIZE,
 615,
 Short.MAX\_VALUE)
 .addComponent(
 jComboBox1,
 0,
 615,
 Short.MAX\_VALUE)))
 .addGroup(
 layout.createSequentialGroup()
 .addGap(20, 20,
 20)
 .addComponent(
 jScrollPane1,
 GroupLayout.DEFAULT\_SIZE,
 607,
 Short.MAX\_VALUE))
 .addGroup(
 layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(
 delRowButton,
 GroupLayout.PREFERRED\_SIZE,
 GroupLayout.DEFAULT\_SIZE,
 GroupLayout.PREFERRED\_SIZE)
 .addPreferredGap(
 LayoutStyle.ComponentPlacement.RELATED,
 74,
 Short.MAX\_VALUE)
 .addComponent(
 searchTableButton)
 .addGap(58, 58,
 58)
 .addComponent(
 loadTableButton,
 GroupLayout.PREFERRED\_SIZE,
 164,
 GroupLayout.PREFERRED\_SIZE))
 .addGroup(
 layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(
 suchText,
 GroupLayout.DEFAULT\_SIZE,
 615,
 Short.MAX\_VALUE))
 .addGroup(
 layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(
 suchLabel,
 GroupLayout.DEFAULT\_SIZE,
 615,
 Short.MAX\_VALUE)))
 .addContainerGap()));
 layout.setVerticalGroup(layout
 .createParallelGroup(GroupLayout.Alignment.LEADING)
 .addGroup(
 layout.createSequentialGroup()
 .addGap(27, 27, 27)
 .addComponent(jLabel1)
 .addPreferredGap(
 LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(jComboBox1,
 GroupLayout.PREFERRED\_SIZE,
 GroupLayout.DEFAULT\_SIZE,
 GroupLayout.PREFERRED\_SIZE)
 .addPreferredGap(
 LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(suchLabel)
 .addPreferredGap(
 LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(suchText,
 GroupLayout.PREFERRED\_SIZE,
 GroupLayout.DEFAULT\_SIZE,
 GroupLayout.PREFERRED\_SIZE)
 .addGap(51, 51, 51)
 .addComponent(jScrollPane1,
 GroupLayout.PREFERRED\_SIZE, 108,
 GroupLayout.PREFERRED\_SIZE)
 .addGap(49, 49, 49)
 .addGroup(
 layout.createParallelGroup(
 GroupLayout.Alignment.TRAILING)
 .addComponent(
 delRowButton,
 GroupLayout.PREFERRED\_SIZE,
 GroupLayout.DEFAULT\_SIZE,
 GroupLayout.PREFERRED\_SIZE)
 .addGroup(
 layout.createParallelGroup(
 GroupLayout.Alignment.BASELINE)
 .addComponent(
 loadTableButton)
 .addComponent(
 searchTableButton)))
 .addGap(57, 57, 57)));

 pack();
 }

 /\*\*
 \* generates an array of Objects when new data file is selected
 \* @param file the file where the data is stored
 \* @return Object[][]
 \*/
 private Object[][] getNewModel(File file) {
 ArrayList list = new ArrayList();
 try {
 if (!file.exists()) {
 file.createNewFile();
 }
 FileReader fr = new FileReader(file);
 BufferedReader br = new BufferedReader(fr);
 String zeile;
 while ((zeile = br.readLine()) != null) {
 String[] teile = zeile.split("#");
 list.add(new Object[] { teile[0], teile[1], teile[2], teile[3] });
 }
 fr.close();
 } catch (Exception e) {
 JOptionPane.showMessageDialog(null, "Fehler: " + e.getMessage(),
 "Fehlermeldung", JOptionPane.ERROR\_MESSAGE);
 }
 Object[][] data = list.toArray(new Object[4][list.size()]);
 return data;
 }

 public static void main(String args[]) {
 java.awt.EventQueue.invokeLater(new Runnable() {
 public void run() {
 new MyAdressDatabase().setVisible(true);
 }
 });
 }

 private JButton loadTableButton;
 private JButton searchTableButton;
 private JButton delRowButton;
 private JComboBox jComboBox1;
 private JInternalFrame jInternalFrame1;
 private JLabel jLabel1;
 private JLabel suchLabel;
 private JTextField suchText;
 private JScrollPane jScrollPane1;
 private JTable jTable1;
 private String defaultAdressdatei;
 private TableRowSorter sorter;

}

Hallo Stephan

Danke für Deine Hilfe. Vom ersten Laufversuch ist es so wie ich es haben wollte. Werde mir aber den Code nochmals genau anschauen und mich bei Unklarheiten melden.
Grüsse Bruno

Hallo Stephan

Habe mir Deinen Code zu Gemüte geführt. Er schien genauso wie ich es mir gedacht hatte. Ich bemerkte jedoch, dass mir öfters nur ein Teil der Tabelle angezeigt wurde, oder die ‚JOptionPane‘ nur leer dargestellt wurde.

Habe meinen Code nochmals zu überarbeiten versucht. Kleine Anmerkung am Rande, es geht hier nur mal um die grundsätzliche Funktionsweise. Buttons deaktivieren, JTable leeren vor neuladen usw. das geht alles, auch bin ich mir bewusst, dass eine Textdatei dieser Art nie im Laufwerk C:\ im Rootverzeichnis gespeichert werden darf, ich habe es nur mal zu Testzwecken und er Einfachheit halber dort angelegt.

Ausgangslage ist, ich habe zwei Textfiles:

Adressdatenbank 1.txt:

xxxxxxx#Max#Auenstrasse 50#99999 Auenland#
b#bb#bbb#bbbb#
c#cc#ccc#cccc#
d#dd#ddd#dddd#
aa#bb#cc#dd#

Adressdatenbank 2.text:

ADressdatenbank2#Max#Auenstrasse 50#99999 Auenland#
b#bb#bbb#bbbb#
c#cc#ccc#cccc#
d#dd#ddd#dddd#
v1#v2#null#null#

Diese beiden Textfiles lasse ich mir in einer Java jTable anzeigen.

Das Java Listing:

import java.awt.\*;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Comparator;
import java.util.regex.PatternSyntaxException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class MAD extends javax.swing.JFrame {

 public MAD() {
 initComponents();
 }
 private void initComponents() {
 jLabel1 = new javax.swing.JLabel();
 jComboBox1 = new javax.swing.JComboBox();
 jInternalFrame1 = new javax.swing.JInternalFrame();
 jScrollPane1 = new javax.swing.JScrollPane();
 jTable1 = new javax.swing.JTable();
 searchTableButton = new javax.swing.JButton();
 suchLabel = new javax.swing.JLabel();
 suchText = new javax.swing.JTextField();
 jTable1 = new javax.swing.JTable();

 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT\_ON\_CLOSE);
 setTitle("MAD");

 jLabel1.setText("Adressdatenbank");
 suchText.setText("SuchText");
 suchLabel.setText("Suchbegriff");
 searchTableButton.setText("Suchen");
 jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Adressdatenbank 1", "Adressdatenbank 2", "Adressdatenbank 3", "Adressdatenbank 4" }));

 searchTableButton.addActionListener(new java.awt.event.ActionListener() {
 TableRowSorter sorter = new TableRowSorter(jTable1.getModel());
 public void actionPerformed(java.awt.event.ActionEvent evt) {
 jTable1.setRowSorter (sorter); 
 suchTextActionPerformed(evt);
 }

 private void suchTextActionPerformed(ActionEvent evt) {
 sorter.setRowFilter( RowFilter.regexFilter("bbb", 2) );
 } 
 });

 jComboBox1.addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(java.awt.event.ActionEvent evt) {
 jComboBox1ActionPerformed(evt);
 loadTableButtonActionPerformed(evt);
 }

 private void loadTableButtonActionPerformed(java.awt.event.ActionEvent evt) 
 {
 DefaultTableModel deft=(DefaultTableModel)jTable1.getModel();
 String selectedItem = (String)jComboBox1.getSelectedItem();
 String Adressdatei = "C:/"+selectedItem+".txt";
 try
 {
 FileReader fr=new FileReader(Adressdatei);
 BufferedReader br=new BufferedReader(fr);
 String zeile;

 while((zeile=br.readLine())!=null)
 {
 String[] teile=zeile.split("#");
 deft.addRow(new Object[]{teile[0],teile[1],teile[2],teile[3],});
 }
 fr.close();
 }
 catch(Exception e)
 {
 JOptionPane.showMessageDialog(null,
 "Fehler: "+e.getMessage(), "Fehlermeldung",
 JOptionPane.ERROR\_MESSAGE);
 }
 }

 private void jComboBox1ActionPerformed(ActionEvent evt) {
 String selectedItem = (String)jComboBox1.getSelectedItem();
 JOptionPane.showMessageDialog(
 null,"Ihre Wahl: " + selectedItem, "Information",
 JOptionPane.INFORMATION\_MESSAGE);
 }
 });
 
 jTable1.setAutoCreateRowSorter(true);
 jTable1.setAutoResizeMode(javax.swing.JTable.AUTO\_RESIZE\_ALL\_COLUMNS);
 jScrollPane1.setViewportView(jTable1);

 Object rows [][] = {};
 Object columns [] = {"Name", "Vorname", "Strasse", "Ort"};
 jTable1.setModel(new javax.swing.table.DefaultTableModel(rows, columns));

 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
 getContentPane().setLayout(layout);
 layout.setHorizontalGroup(
 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 .addGroup(layout.createSequentialGroup()
 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 .addContainerGap()
 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT\_SIZE, 615, Short.MAX\_VALUE)
 .addComponent(jComboBox1, 0, 615, Short.MAX\_VALUE)))
 .addGroup(layout.createSequentialGroup()
 .addGap(20, 20, 20)
 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT\_SIZE, 607, Short.MAX\_VALUE))
 .addGroup(layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(suchText, javax.swing.GroupLayout.DEFAULT\_SIZE, 615, Short.MAX\_VALUE))
 .addGroup(layout.createSequentialGroup()
 .addContainerGap()
 .addComponent(suchLabel, javax.swing.GroupLayout.DEFAULT\_SIZE, 615, Short.MAX\_VALUE))
 .addGroup(layout.createSequentialGroup()
 .addGap(148, 148, 148)
 .addComponent(searchTableButton)))
 .addContainerGap())
 );
 layout.setVerticalGroup(
 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 .addGroup(layout.createSequentialGroup()
 .addGap(27, 27, 27)
 .addComponent(jLabel1)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED\_SIZE, javax.swing.GroupLayout.DEFAULT\_SIZE, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(suchLabel)
 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 .addComponent(suchText, javax.swing.GroupLayout.PREFERRED\_SIZE, javax.swing.GroupLayout.DEFAULT\_SIZE, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addGap(51, 51, 51)
 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED\_SIZE, 108, javax.swing.GroupLayout.PREFERRED\_SIZE)
 .addGap(49, 49, 49)
 .addComponent(searchTableButton)
 .addGap(57, 57, 57))
 );
 pack();
 }
 public static void main(String args[]) {
 java.awt.EventQueue.invokeLater(new Runnable() {
 public void run() {
 new MAD().setVisible(true);
 }
 });
 }

 private javax.swing.JButton searchTableButton;
 private javax.swing.JComboBox jComboBox1;
 private javax.swing.JInternalFrame jInternalFrame1;
 private javax.swing.JLabel jLabel1;
 private javax.swing.JLabel suchLabel;
 private javax.swing.JTextField suchText;
 private javax.swing.JScrollPane jScrollPane1;
 private javax.swing.JTable jTable1;
}

nun habe ich eine Funktion und Button welche die Tabelle nach einem Wert durchsuchen und nur die Zeilen anzeigen sollte, welche den im ‚Suchfeld‘ erfassten Eintrag enthalten.

Soweit ich das aus der Javadoc gelesen habe, ist dies im defaultModel nicht möglich und ich muss ein eigenes Model implementieren. Aber irgendwie klappt das bei mir nicht… auch nicht nach Stunden von Versuchen…ufff…

Darum wäre ich nochmals für Hilfe und Tipps sehr dankbar.

Grüsse
Bruno

In dem Code, den ich rein kopiert hatte, war die gewünschte Funktion enthalten. U. a. war da auch eine Innere Klasse namens ‚MyModel‘. Auch das Entfernen der Daten und überschreiben von Daten war da mit drin.
Schau dir die Unterschiede zwischen deinem und meinem Code an und übernimm, was dir noch fehlt.
Wenn du eine bestimmte Funktion für einen bestimmten Button haben willst, schreib mir genauer auf, was du brauchst.
Im Übrigen brauchst Du nicht den vollqualifizierten Namen einer Klasse schreiben:

new javax.swing.DefaultComboBoxModel

kannst du ersetzen durch

new DefaultComboBoxModel

Gruß, Stephan

Hallo Stephan

Danke nochmals für Deinen Code. Weiss echt nicht, was ich gemacht hatte, denn der Code funktioniert.

Eine kleine Frage habe ich noch: Wie ich festgestellt habe, wird beim Suchen jeweils nur die erste Spalte durchsucht. Kannst Du mir weiterhelfen wo ich es ändern könnte, damit alle Spalten durchsucht werden? Habe das leider bis jetzt nicht rausgefunden.

Danke und Gruss
Bruno

in dem code musst du den Filter austauschen
ich habe den Filter so erstellt, dass er nur Strings erwartet und vergleicht:

 private void suchTextActionPerformed(ActionEvent evt) {
 final String text = suchText.getText();
 if (text.length() == 0) {
 sorter.setRowFilter(null);
 } else {
 System.out.println("search for :" + text);
 try {
 RowFilter filter = new RowFilter() {
 public boolean include(Entry entry) {
 int count = entry.getValueCount();
 for (int i = 0; i 

Gruß, Stephan

Hallo Stephan

Hier bin ich wieder, habe mich mit deinem Code auseinandergesetzt, bin aber doch nicht weitergekommen damit. Nun habe ich mich entschlossen die Daten anstelle in einem normalen Textfile in einem XML File zu speichern. Mir erscheint das besser geeignet, da eine Struktur vorhanden ist.

Was ich aber noch immer nicht hingekriegt habe ist das mit dem Filtern der Tabelle nach einem Wert. Beiliegend habe ich mal meinen Code zugefügt wie er nun aussieht. Vielleicht sieht jemand gleich woran es liegt dass die Tabelle nicht gefiltert wird bzw. was ich falsch mache.

Oder hat jemand von Euch eine ähnliches Projekt mit XML-Datei in JTable lesen und danach die ganze JTable nach einem Wert filtern?

Gruss
Bruno

import java.awt.\*;
import java.awt.event.\*;
import java.beans.\*;
import java.io.\*;
import java.util.ArrayList;
import java.util.regex.PatternSyntaxException;

import javax.swing.\*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
 
public class TableSave extends JFrame {
 
 private String filename = "D:/Bruno/Workspace/AddressBook01/Adressdatenbank 1.xml";
 private JTable table;
 private MyTableModel tableModel;
 private MyColumnModel columnModel;
 private TableRowSorter sorter;
 private JButton searchTableButton;
 private JLabel jLabel1;
 private JLabel suchLabel;
 private JTextField suchText;
 private JScrollPane jScrollPane1;
 private String defaultAdressdatei;

 public TableSave() {
 super("TableSaveColumns");

 jLabel1 = new JLabel();
 jScrollPane1 = new JScrollPane();
 searchTableButton = new JButton();
 suchLabel = new JLabel();
 suchText = new JTextField();
 setTitle("MAD");
 jLabel1.setText("Adressdatenbank");
 suchText.setText("SuchText");
 suchLabel.setText("Suchbegriff");
 searchTableButton.setText("Suchen");
 defaultAdressdatei = "D:/Bruno/Workspace/AddressBook01/Adressdatenbank 1.xml";
 setDefaultCloseOperation(WindowConstants.DO\_NOTHING\_ON\_CLOSE);
 setSize(800, 600);
 setLocationRelativeTo(null);

 tableModel = new MyTableModel();
 table = new JTable(tableModel);
 table.setAutoCreateRowSorter(true);
 sorter = new TableRowSorter(tableModel);
 table.setModel(tableModel);
 getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
 columnModel = new MyColumnModel();
 table.setColumnModel(columnModel);
 tableModel.addRow(new Object[]{"Name", "Vorname", "Strasse", "Nummer", "PLZ", "Ort", "Kennzeichnung", "Gruppe"});
 loadTable();

 addWindowListener(new WindowAdapter() {
 
 public void windowClosing(final WindowEvent evt) {
 dispose();
 }
 });

 searchTableButton.addActionListener(new java.awt.event.ActionListener() {
 public void actionPerformed(ActionEvent evt) {
 String text = suchText.getText();
 suche(text);
 }

 private void suche(String suchBegriff){
 for(int i=0; i