JTable Filtern

Java_Bruno

Grünschnabel
Hallo zusammen

Obwohl ich schon mehrere Tage damit verbracht habe, komme ich einfach nicht weiter. Wahrscheinlich habe ich irgendwo den falschen Ansatz aber weiss echt nicht wo.

Ich habe eine JTable erstellt, welche durch ein XML Dokument befüllt wird. Nun möchte ich über ein Textfeld einen Zeichenkettenausdruck eingeben und danach sollte die Tabelle nach diesem Ausdruck durchsucht werden.

Ich habe es zwar hingekriegt, dass die erste Zeile in welcher der Begriff vorkommt markiert wird, aber ein Filter wird nicht gesetzt.

Könnt Ihr mir weiterhelfen, bevor ich noch mit dem Ding ganz verzweifle?

Bin für jede Hilfe dankbar.
Gruss
Bruno


Hier ist mal der Java Quellcode ohne GUI Teil:
Java:
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<TableModel> 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>(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<table.getColumnCount(); i++){
		            for(int j=0; j < table.getRowCount();j++){
		                if(table.getValueAt(j,i).toString().contains(suchBegriff)){
		                    table.setRowSelectionInterval(j,j);
		                    sorter.setRowFilter(RowFilter.regexFilter(suchBegriff));
		                    break;
		                }
		            }
		        }
		    }
		});
		
	}
 
    private boolean loadTable() {
        try {
        	String filename = "D:/Bruno/Workspace/AddressBook01/Adressdatenbank 1.xml";
            XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
            tableModel = (MyTableModel) d.readObject();
            table.setModel(tableModel);
            columnModel = (MyColumnModel) d.readObject();
            table.setColumnModel(columnModel);
            jScrollPane1.setViewportView(table);
 
Zuletzt bearbeitet von einem Moderator:
Hi
packe deinen Code bitte in die Java-Tags (siehe meine Signatur). Außerdem ist der Code nicht vollständig (sondern offensichtlich unten abgeschnitten).
Was funktioniert an diesem Filter nicht? Gibt es Fehlermeldungen?
 
Hi
schon mal danke für deine Nachricht. Jo sorry hatte die HTML Tags erwischt. Nachfolgend mein Code mit den HTML Tags.

Java:
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 Jtable_XML extends JFrame {
 
    private String filename = "D:/Bruno/Workspace/AddressBook01/Adressdatenbank 1.xml";
    private JTable table;
    private MyTableModel tableModel;
    private MyColumnModel columnModel;
	private TableRowSorter<TableModel> sorter;
	private JButton searchTableButton;
	private JLabel jLabel1;
	private JLabel suchLabel;
	private JTextField suchText;
	private JScrollPane jScrollPane1;
	private String defaultAdressdatei;
	
    public Jtable_XML() {
        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>(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<table.getColumnCount(); i++){
		            for(int j=0; j < table.getRowCount();j++){
	                	System.out.println("Row: " + j+ " Column: " + i + "suchBegriff: "+suchBegriff);
		                if(table.getValueAt(j,i).toString().contains(suchBegriff)){
		                	System.out.println("j: " + j+ " i: " + i + "suchBegriff: "+suchBegriff);
		                    table.setRowSelectionInterval(j,j);
		                    sorter.setRowFilter(RowFilter.regexFilter(suchBegriff));
		                    break;
		                }
		            }
		        }
		    }
		});
		
	}

 
    private boolean loadTable() {
        try {
        	String filename = "D:/Bruno/Workspace/AddressBook01/Adressdatenbank 1.xml";
            XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
            tableModel = (MyTableModel) d.readObject();
            table.setModel(tableModel);
            columnModel = (MyColumnModel) d.readObject();
            table.setColumnModel(columnModel);
            jScrollPane1.setViewportView(table);
            
            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(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 885, Short.MAX_VALUE))
                        .addGroup(layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(layout.createSequentialGroup()
                                    .addGap(95, 95, 95)
                                    .addComponent(suchText, javax.swing.GroupLayout.DEFAULT_SIZE, 99, Short.MAX_VALUE)
                                    .addGap(42, 42, 42))
                                .addGroup(layout.createSequentialGroup()
                                    .addContainerGap()
                                    .addComponent(searchTableButton)
                                    .addGap(18, 18, 18)))
                            .addGap(661, 661, 661)))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(274, 274, 274)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 132, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(suchText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(18, 18, 18)
                    .addComponent(searchTableButton)
                    .addGap(52, 52, 52))
            );

            pack();
            
            d.close();
        } catch (FileNotFoundException ex) {
            return false;
        }
        return true;
        
    }
 
    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {
 
            public void run() {
                new Jtable_XML().setVisible(true);
            }
        });
    }
    

}

Dies ist nun die vollständige Klasse.

Das Projekt besteht dann noch aus zwei weiteren Klassen:

- MyTableModel.java
- MyColumnModel.java

Und eine XML-Datei.

Der Code läuft auch wenn ich auf 'Suchen' klicke. Er markiert dann eine eventuelle Zeile, in welcher der Suchbegriff vorkommt, aber er filtert nicht die anderen Zeilen aus.

Die Java Insel habe ich, bin jedoch leider wirklich nicht mehr weitergekommen.

Wäre weiterhin dankbar um Hilfe und Tipps.
Gruss
Bruno
 
Zurück