Kombinieren von Filter-Optionen für JTable

justgame

Mitglied
Wieder ich.

Ich habe für meinen JTable zwei Filter-Optionen eingebaut, siehe Bild.


myimg.de - Unbenannt1e3301.jpg

Wenn ich in meiner Combobox-Augenfarbe beispielsweise "blau" anwähle, werden mir in meiner Tabelle alle mit einer blauen Augenfarbe ausgegeben. Das selbe gilt auch für Nationalität.
Beide für sich funktionieren einwandfrei.

Problem:
Wenn Augenfarbe auf "blau" gesetzt ist, und ich danach eine Nationalität auswähle zum Beispeil "spanisch" werden, alle Spanier angezeigt ohne Berücksichtigung der Augenfarbe.
Mein Ziel wäre es alle Spanier mit blauen Augen anzeigen zu lassen.

Java:
public void showAugenfarbe() {

        TableModel model = new MyModel();
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        tabelle.setRowSorter(sorter);

        String text = cb_aug.getSelectedItem().toString();
        if (text.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            try {
                sorter.setRowFilter(
                        RowFilter.regexFilter(text));
            } catch (PatternSyntaxException pse) {
              
            }
        }

    }

Java:
public void showNationalitat() {

        TableModel model = new MyModel();
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        tabelle.setRowSorter(sorter);

        String text = cb_nat.getSelectedItem().toString();
        if (text.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            try {
                sorter.setRowFilter(
                        RowFilter.regexFilter(text));
            } catch (PatternSyntaxException pse) {
              
            }
        }

    }
 

turtle

Top Contributor
das kannst du mit einem AND-Filter kombinieren, siehe mein Beispiel
Java:
package jtable;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

@SuppressWarnings("serial")
public class Table extends JPanel {
	private MeinTableModel tableModel;
	private List<Daten> listDaten;
	private JTable table;
	private JButton btnAdd;
	private Random random = new Random();
	private TableRowSorter<TableModel> sorter;

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Table() {
		setLayout(new BorderLayout());
		// @formatter:off
        Daten[] memoryDaten = new Daten[] { 
            new Daten("Turtle", 20, false,"1.1.1993"),
            new Daten("Andreas", 10, false,"10.5.2003"),
            new Daten("Bärbel", 30, true,"20.02.1986"),
            new Daten("Christian", 40, false,"11.11.1980"),
            new Daten("Doris", 50, false,"22.02.1970"),
            new Daten("Emil", 66, true,"7.2.1966"),
            new Daten("Franziska", 70, true,"12.9.1955"),
            new Daten("Gerhard", 30, false,"16.08.1983"),
            new Daten("Heike", 33, false,"17.08.1986"),
            new Daten("Ingo", 22, false,"30.12.1992"),
        };
        // @formatter:on
		listDaten = Arrays.asList(memoryDaten);
		tableModel = new MeinTableModel(listDaten);
		table = new JTable(tableModel);
		ButtonRenderer buttonRenderer = new ButtonRenderer(tableModel);
		table.setDefaultRenderer(Integer.class, buttonRenderer);
		sorter = new TableRowSorter<>(tableModel);
		RowFilter ageFilter = new RowFilter<MeinTableModel, Integer>() {

			@Override
			public boolean include(javax.swing.RowFilter.Entry<? extends MeinTableModel, ? extends Integer> entry) {
				MeinTableModel model = entry.getModel();
				int row = entry.getIdentifier();
				int alter = (int) model.getValueAt(row, 1);
				if (alter < 30) { return true; }
				return false;
			}

		};
		RowFilter nameFilter = new RowFilter<MeinTableModel, Integer>() {
			@Override
			public boolean include(javax.swing.RowFilter.Entry<? extends MeinTableModel, ? extends Integer> entry) {
				MeinTableModel model = entry.getModel();
				int row = entry.getIdentifier();
				String name = (String) model.getValueAt(row, 0);
				if (name.contains("n")) { return true; }
				return false;
			}

		};
		java.util.List<RowFilter<Object, Object>> allFilter = new ArrayList<RowFilter<Object, Object>>();
		allFilter.add(ageFilter); // Turtle, Andreas, Ingo
		allFilter.add(nameFilter); // Andreas, Christian, Franziska, Ingo
		RowFilter<Object, Object> bothFilterAnded = RowFilter.andFilter(allFilter);
		sorter.setRowFilter(bothFilterAnded); // Andreas, Ingo
		table.setRowSorter(sorter);
		// table.setAutoCreateRowSorter(true);
		btnAdd = new JButton("Add/Reload");
		btnAdd.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				int suffix = random.nextInt(10);
				// @formatter:off
        Daten[] neueDaten = new Daten[] { 
            new Daten("Turtle-"+suffix, 20, false, "1.1.1993"), 
            new Daten("Andreas-"+suffix, 10, false, "10.5.2003"),
            new Daten("Bärbel-"+suffix, 30, true, "20.02.1988"), 
            new Daten("Christian-"+suffix, 40, false, "11.11.1980"),
            new Daten("Doris-"+suffix, 50, false, "22.02.1970"), 
            new Daten("Emil-"+suffix, 66, true, "7.2.1966"),
            new Daten("Franziska-"+suffix, 70, true, "12.9.1955"), 
            new Daten("Gerhard-"+suffix, 30, false, "16.08.1983"),
            new Daten("Heike-"+suffix, 33, false, "17.08.1986"), 
            new Daten("Ingo-"+suffix, 22, false, "30.12.1992"), };
        // @formatter:on
				List<Daten> neuDaten = Arrays.asList(neueDaten);
				tableModel.addiereNeueDaten(neuDaten);

			}
		});
		JScrollPane scrollPane = new JScrollPane(table);
		add(scrollPane, BorderLayout.CENTER);
		add(btnAdd, BorderLayout.SOUTH);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Table Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new Table());
		frame.pack();
		frame.setVisible(true);
	}
}

@SuppressWarnings("serial")
class MeinTableModel extends AbstractTableModel {
	private List<Daten> listDaten;
	private List<String> listColumns;

	public MeinTableModel(List<Daten> daten) {
		this.listDaten = new ArrayList<Daten>();
		for (Daten datenSatz : daten) {
			listDaten.add(datenSatz);
		}
		listColumns = new ArrayList<String>();
		listColumns.add("Name");
		listColumns.add("Alter");
		listColumns.add("Rentner");
		listColumns.add("Geburtstag");

	}

	public List<Daten> getListDaten() {
		return listDaten;
	}

	public void addiereNeueDaten(List<Daten> neueDaten) {
		for (Daten daten : neueDaten) {
			listDaten.add(daten);
		}
		fireTableStructureChanged();
	}

	@Override
	public int getRowCount() {
		return listDaten.size();
	}

	public Class<?> getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return String.class;
		case 1:
			return Integer.class;
		case 2:
			return Boolean.class;
		case 3:
			return Date.class;
		}
		return null;
	}

	@Override
	public int getColumnCount() {
		return listColumns.size();
	}

	public String getColumnName(int column) {
		return listColumns.get(column);
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Daten daten = listDaten.get(rowIndex);
		if (daten != null) {
			switch (columnIndex) {
			case 0:
				return daten.getName();
			case 1:
				return daten.getAlter();
			case 2:
				return daten.isRentner();
			case 3:
				return daten.getGeburtstag();
			}
		}
		return null;
	}
}

class Daten {
	private String name;
	private Boolean rentner;
	private Date geburtstag;
	private Integer alter;
	private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

	public Daten(String name, Integer alter, Boolean rentner, String geb) {
		try {
			this.name = name;
			this.alter = alter;
			this.rentner = rentner;
			this.geburtstag = sdf.parse(geb);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Boolean isRentner() {
		return rentner;
	}

	public void setRentner(Boolean rentner) {
		this.rentner = rentner;
	}

	public Date getGeburtstag() {
		return geburtstag;
	}

	public void setGeburtstag(Date geburtstag) {
		this.geburtstag = geburtstag;
	}

	public int getAlter() {
		return alter;
	}

	public void setAlter(Integer alter) {
		this.alter = alter;
	}
}

class ButtonRenderer implements TableCellRenderer {
	private MeinTableModel meinTableModel;

	public ButtonRenderer(MeinTableModel meinTableModel) {
		this.meinTableModel = meinTableModel;
	}

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
			int row, int column) {
		TableModel model = table.getModel();
		Integer age = (Integer) model.getValueAt(row, column);
		JButton ageButton = new JButton("" + age);
		ageButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				List<Daten> listDaten = meinTableModel.getListDaten();
				Daten daten = listDaten.get(5);
				JOptionPane.showMessageDialog(null, "Sie haben auf " + daten.getName() + " geklickt");
			}
		});
		return ageButton;
	}
}
 

justgame

Mitglied
Hat geklappt (Y), danke


Ich würde jetzt gerne zwei Textfelder realisieren, in das erste Textfeld kommt das Mindest-Alter in das Zweite dann das Höchst-Alter. Nach einem Buttonklick sollen mir alle Zeilen ausgegeben werden, wo sich das Alter zwischen diesen beiden Zahlen befindet.
Habt ihr zufällig eine Idee wie man dieses realisieren könnte ?
 

turtle

Top Contributor
ist das nicht genau mein RowFilter ageFilter?
Java:
RowFilter ageFilter = new RowFilter<MeinTableModel, Integer>() {
 
            @Override
            public boolean include(javax.swing.RowFilter.Entry<? extends MeinTableModel, ? extends Integer> entry) {
                MeinTableModel model = entry.getModel();
                int row = entry.getIdentifier();
                int alter = (int) model.getValueAt(row, 1);
                if (alter < 30) { return true; }
                return false;
            }
 
        };

Nur das deine Version NICHT auf den festen Wert von 30 testen muss, sondern auf die Werte aus den beiden Textfeldern.
 

justgame

Mitglied
Also ich hab mich mal bisschen mit der RowFilter-Documentation auseinandergesetzt und folgende Lösung gefunden...
Falls jemand irgendwann mal vor dem selben Problem steht. Ist vllt nicht die eleganteste Lösung aber es klappt....


Java:
  String txt3 = alter_min.getText();
        int int3 = Integer.parseInt(txt3) - 1;
        Integer intObj1 = new Integer(int3);
        Number numObj1 = (Number) intObj1;

        String txt4 = alter_max.getText();
        int int4 = Integer.parseInt(txt4) + 1;
        Integer intObj2 = new Integer(int4);
        Number numObj2 = (Number) intObj2;

        RowFilter<TableModel, Object> alterMIN = null;
        RowFilter<TableModel, Object> alterMAX = null;

            alterMIN = RowFilter.numberFilter(ComparisonType.AFTER, numObj1, 4);
            alterMAX = RowFilter.numberFilter(ComparisonType.BEFORE, numObj2, 4);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing Kombinieren von SWT und Excel AWT, Swing, JavaFX & SWT 5
D JIDE TreeComboBox mit checkbox-en kombinieren AWT, Swing, JavaFX & SWT 2
F JMenuItem mit KeyStroke kombinieren AWT, Swing, JavaFX & SWT 1
bluerob Java 3D mit 2D kombinieren AWT, Swing, JavaFX & SWT 3
P Swing JComboBox mit JToggleButton kombinieren AWT, Swing, JavaFX & SWT 4
H AWT setSize()/setBounds() und pack() kombinieren!? AWT, Swing, JavaFX & SWT 3
A AWT AWT Panelfenster mit Graphics kombinieren AWT, Swing, JavaFX & SWT 7
L JFreeChart StackedBar + Line-Chart kombinieren AWT, Swing, JavaFX & SWT 4
C MouseListener und ActionListener kombinieren AWT, Swing, JavaFX & SWT 17
M Effekte kombinieren und speichern ! AWT, Swing, JavaFX & SWT 6
A Mehrere KeyEvents kombinieren AWT, Swing, JavaFX & SWT 12
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
D Filter in Tabelle Sql AWT, Swing, JavaFX & SWT 6
D JavaFX Table Filter AWT, Swing, JavaFX & SWT 4
J ComboBox als Filter benutzen AWT, Swing, JavaFX & SWT 1
M Filter in die JFace/SWT Tabelle einbauen AWT, Swing, JavaFX & SWT 5
C Eclipse Filter-Muster AWT, Swing, JavaFX & SWT 2
B Swing Filter für JTable mit Netbeans Editor AWT, Swing, JavaFX & SWT 2
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
D Filter für JTable AWT, Swing, JavaFX & SWT 5
M JTable Filter AWT, Swing, JavaFX & SWT 3
C Swing Dynamische JComboBox (Filter) AWT, Swing, JavaFX & SWT 28
S JTable Filter nach Wort oder Wortteil über ganze Tabelle AWT, Swing, JavaFX & SWT 5
jueki Aktuell eingestellten Filter aus einem JFileChooser abfragen. AWT, Swing, JavaFX & SWT 5
M ISelection an Filter übergeben AWT, Swing, JavaFX & SWT 2
L SWT Filter zur TreeViewer hinzufügen AWT, Swing, JavaFX & SWT 9
K JTable wird nicht aktualisiert, wenn Filter gesetzt ist AWT, Swing, JavaFX & SWT 9
E Swing JTree Filter Suche mit Collapse?! AWT, Swing, JavaFX & SWT 4
C JTable Dropdown Filter AWT, Swing, JavaFX & SWT 5
B AWT FileDialog Filter wird ignoriert AWT, Swing, JavaFX & SWT 7
D JTree Filter erstellen AWT, Swing, JavaFX & SWT 4
G Jfilechooser filter AWT, Swing, JavaFX & SWT 10
H FileChooser und Filter AWT, Swing, JavaFX & SWT 4
G Probleme mit JFileChooser und Filter AWT, Swing, JavaFX & SWT 11
G dynamischer Filter bei JTable AWT, Swing, JavaFX & SWT 2
D HSB - Filter AWT, Swing, JavaFX & SWT 3
V Filter im JFileChooser. AWT, Swing, JavaFX & SWT 5
L Optionen übernehmen AWT, Swing, JavaFX & SWT 5
B Gestaltung eines Optionen-Dialog AWT, Swing, JavaFX & SWT 16
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
J Ansicht wechseln zw. Spielfeld und Optionen AWT, Swing, JavaFX & SWT 3
V System Look and Feel, FileChooser, Optionen einer jar-Datei AWT, Swing, JavaFX & SWT 10
T JDialog als Optionen Fenster verwenden AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben