ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
522
522
EMPFEHLEN
-
Hallo zusammen,
ich habe ein Problem mit einer fixen Column (RowHeader) im Table, welche die Zeilennummer anzeigt. Derzeit filtere ich über das Model mit dem RowFilter - wird die Suche ausgelöst, werden die Zeilennummern im ListModel nicht ausgeblendet (siehe nachfolgende Source).
Bsp.: Ich suche nach SUN - so müsste sich nur noch die Zeilennummer 1 stehen bleiben, es sind aber 8 sichtbar... Weiß jemand, wie man das mit dem RowSorter unter einen Hut bekommt ?
Danke schon mal vorab für die Bemühungen,
Gruß
Reiner
Klasse: FilterTable
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.util.regex.*; public class FilterTable { public static void main(String args[]) { Runnable runner = new Runnable() { public void run() { JFrame frame = new JFrame("Sorting JTable"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Object rows[][] = {{"AMZN", "Amazon", 41.28}, {"EBAY", "eBay", 41.57}, {"GOOG", "Google", 388.33}, {"MSFT", "Microsoft", 26.56}, {"NOK", "Nokia Corp", 17.13}, {"ORCL", "Oracle Corp.", 12.52}, {"SUNW", "Sun Microsystems", 3.86}, {"TWX", "Time Warner", 17.66}, {"VOD", "Vodafone Group", 26.02}, {"YHOO", "Yahoo!", 37.69}}; Object columns[] = {"Symbol", "Name", "Price"}; TableModel model = new DefaultTableModel(rows, columns) { public Class getColumnClass(int column) { Class returnValue; if ((column >= 0) && (column < getColumnCount())) { returnValue = getValueAt(0, column).getClass(); } else { returnValue = Object.class; } return returnValue; } }; JTable table = new JTable(model); final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); table.setRowSorter(sorter); JScrollPane pane = new JScrollPane(table); frame.add(pane, BorderLayout.CENTER); // Zeilennummerierung DefaultListModel modelRowHeader = new DefaultListModel(); JList lstRowHeader = new JList(modelRowHeader); pane.setRowHeaderView(lstRowHeader); lstRowHeader.setFixedCellWidth(40); lstRowHeader.setVisible(true); int cntRow = 0; for (int i = 0; i < rows.length; i++) { modelRowHeader.addElement(cntRow++); } JPanel panel = new JPanel(new BorderLayout()); JLabel label = new JLabel("Filter"); panel.add(label, BorderLayout.WEST); final JTextField filterText = new JTextField(""); panel.add(filterText, BorderLayout.CENTER); frame.add(panel, BorderLayout.NORTH); JButton button = new JButton("Filter"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String text = filterText.getText(); if (text.length() == 0) { sorter.setRowFilter(null); } else { try { sorter.setRowFilter(RowFilter.regexFilter(text)); } catch (PatternSyntaxException pse) { System.err.println("Bad regex pattern"); } } } }); frame.add(button, BorderLayout.SOUTH); frame.setSize(300, 250); frame.setVisible(true); } }; EventQueue.invokeLater(runner); } }
-
19.10.10 23:06 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
schau mal hier:
http://tips4java.wordpress.com/2008/...-number-table/
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hallo Thomas,
bei dem NumberTable ist genau das gleiche Problem - sofern man den TableRowSorter einsetzt - die Zeilennummerierung wird nicht auf das gefilterte reduziert... Wie bekommt man das in den Griff ?
Gruß
Reiner
-
20.10.10 13:35 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
wie wärs denn damit?
Minimal Version:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
package de.tutorials.training; import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; 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.TableModel; import javax.swing.table.TableRowSorter; public class FilterableJTableExample extends JFrame { JTable table; JTextField txtFilter; public FilterableJTableExample() { super("FilterableJTableExample with Custom RowHeader"); setDefaultCloseOperation(EXIT_ON_CLOSE); Object[][] rowData = new Object[][] { { "a1", "b1", "c1" }, { "a2", "b2", "c2" }, { "a3", "b3", "c3" } }; Object[] columnNames = new Object[] { "", "a", "b", "c" }; DefaultTableModel model = new DefaultTableModel(rowData, columnNames) { @Override public Object getValueAt(int row, int column) { if (column == 0) { return row; } else { return super.getValueAt(row, column - 1); } } @Override public void setValueAt(Object aValue, int row, int column) { if (column > 0) { super.setValueAt(aValue, row, column - 1); } } }; table = new JTable(model) { public boolean isCellEditable(int row, int column) { if (column == 0) { return false; } else { return super.isCellEditable(row, column); } } }; TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) { @Override public boolean isSortable(int column) { return column != 0; } }; table.setRowSorter(sorter); txtFilter = createFilterField(sorter); add(txtFilter, BorderLayout.NORTH); add(new JScrollPane(table), BorderLayout.CENTER); pack(); setVisible(true); } protected JTextField createFilterField(final TableRowSorter<TableModel> sorter) { final JTextField txtFilter = new JTextField(20); txtFilter.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (txtFilter.getText().trim().length() > 0) { sorter.setRowFilter(RowFilter.regexFilter(txtFilter.getText(), 1 /* * column index(ices) to * filter */)); } else { sorter.setRowFilter(null); } } }); return txtFilter; } public static void main(String[] args) { new FilterableJTableExample(); } }
Eigener CellRenderer
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
package de.tutorials.training; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JLabel; 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.TableCellRenderer; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class FilterableJTableExample extends JFrame { JTable table; JTextField txtFilter; public FilterableJTableExample() { super("FilterableJTableExample with Custom RowHeader"); setDefaultCloseOperation(EXIT_ON_CLOSE); Object[][] rowData = new Object[][] { { "a1", "b1", "c1" }, { "a2", "b2", "c2" }, { "a3", "b3", "c3" } }; Object[] columnNames = new Object[] { "#", "a", "b", "c" }; DefaultTableModel model = new DefaultTableModel(rowData, columnNames) { @Override public Object getValueAt(int row, int column) { if (column == 0) { return row; } else { return super.getValueAt(row, column - 1); } } }; final TableCellRenderer rowHeaderRenderer = createRowHeaderRenderer(); table = new JTable(model) { public boolean isCellEditable(int row, int column) { if (column == 0) { return false; } else { return super.isCellEditable(row, column); } }; public TableCellRenderer getCellRenderer(int row, int column) { if (column == 0) { return rowHeaderRenderer; } else { return super.getCellRenderer(row, column); } } }; final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); table.setRowSorter(sorter); txtFilter = createFilterField(sorter); add(txtFilter, BorderLayout.NORTH); add(new JScrollPane(table), BorderLayout.CENTER); pack(); setVisible(true); } protected JTextField createFilterField(final TableRowSorter<TableModel> sorter) { final JTextField txtFilter = new JTextField(20); txtFilter.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (txtFilter.getText().trim().length() > 0) { sorter.setRowFilter(RowFilter.regexFilter(txtFilter.getText(), 1 /* * which column index(ices) to filter */)); } else { sorter.setRowFilter(null); } } }); return txtFilter; } private TableCellRenderer createRowHeaderRenderer() { return new TableCellRenderer() { JLabel rowHeaderLabel = new JLabel(); @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { rowHeaderLabel.setText(String.valueOf(value)); return rowHeaderLabel; } }; } public static void main(String[] args) { new FilterableJTableExample(); } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hi Thomas,
ok, Du hast die Infos mit ins Model geworfen , was sich Table und RowHeader teilen...
Genau das wollte ich nicht... Ziel ist es einfach nur,
extrem markante Infos immer zu sehen, quasi wie in Excel, dort kannst Du ja auch Spalten fixieren und den Content nocht links oder rechts scrollen...
Gruß
Reiner
-
21.10.10 10:18 #6
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
dann versuchs mal damit:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
package de.tutorials.training; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.RowFilter; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class FilterableJTableExample extends JFrame { JTable table; JTextField txtFilter; public FilterableJTableExample() { super("FilterableJTableExample with Custom RowHeader"); setDefaultCloseOperation(EXIT_ON_CLOSE); Object[][] rowData = new Object[][] { { "a1", "b1", "c1" }, { "a2", "b2", "c2" }, { "a3", "b3", "c3" } }; Object[] columnNames = new Object[] {"a", "b", "c" }; final DefaultTableModel model = new DefaultTableModel(rowData, columnNames); table = new JTable(model); TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) { @Override public boolean isSortable(int column) { return column != 0; } }; table.setRowSorter(sorter); DefaultTableModel headerModel = new DefaultTableModel(){ public String getColumnName(int column) { return ""; } public int getColumnCount() { return 1; } public int getRowCount() { return table.getRowCount(); } public Object getValueAt(int row, int column) { return row; } public TableModelListener[] getTableModelListeners() { return model.getTableModelListeners();} }; JTable rowHeaders = new JTable(headerModel){ public boolean isCellEditable(int row, int column) { return false; } }; rowHeaders.setRowSorter(sorter); rowHeaders.setSelectionModel(table.getSelectionModel()); txtFilter = createFilterField(sorter); add(txtFilter, BorderLayout.NORTH); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setRowHeaderView(rowHeaders); scrollPane.getRowHeader().setPreferredSize(new Dimension(35,0)); add(scrollPane, BorderLayout.CENTER); pack(); setVisible(true); } protected JTextField createFilterField(final TableRowSorter<TableModel> sorter) { final JTextField txtFilter = new JTextField(20); txtFilter.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (txtFilter.getText().trim().length() > 0) { sorter.setRowFilter(RowFilter.regexFilter(txtFilter.getText(), 0 /* * column index(ices) to * filter */)); } else { sorter.setRowFilter(null); } } }); return txtFilter; } public static void main(String[] args) { new FilterableJTableExample(); } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hi Tom,
genau so hatte ich mir das vorgestellt - vielen Dank !
Gruß
Reiner
Ähnliche Themen
-
JTable
Von Stefan1987 im Forum Java GrundlagenAntworten: 2Letzter Beitrag: 28.09.09, 16:32 -
JTable in JTable mit JButton
Von indianerrostock im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 25.02.09, 16:29 -
Jtable
Von kokoriko im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 05.10.07, 16:20 -
JTable
Von mamilo im Forum JavaAntworten: 2Letzter Beitrag: 16.04.07, 11:57 -
JTable...
Von jwsd_e im Forum JavaAntworten: 2Letzter Beitrag: 26.05.06, 15:27





Zitieren

Login





