tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
522
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    RLott RLott ist offline Mitglied
    Registriert seit
    Jul 2004
    Beiträge
    15
    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);
        }
    }
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
     
    Java 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

  3. #3
    RLott RLott ist offline Mitglied
    Registriert seit
    Jul 2004
    Beiträge
    15
    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
     

  4. #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ß Tom
     
    Java 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

  5. #5
    RLott RLott ist offline Mitglied
    Registriert seit
    Jul 2004
    Beiträge
    15
    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
     

  6. #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ß Tom
     
    Java 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

  7. #7
    RLott RLott ist offline Mitglied
    Registriert seit
    Jul 2004
    Beiträge
    15
    Hi Tom,

    genau so hatte ich mir das vorgestellt - vielen Dank !

    Gruß
    Reiner
     

Ähnliche Themen

  1. JTable
    Von Stefan1987 im Forum Java Grundlagen
    Antworten: 2
    Letzter Beitrag: 28.09.09, 16:32
  2. JTable in JTable mit JButton
    Von indianerrostock im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 25.02.09, 16:29
  3. Jtable
    Von kokoriko im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 05.10.07, 16:20
  4. JTable
    Von mamilo im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.04.07, 11:57
  5. JTable...
    Von jwsd_e im Forum Java
    Antworten: 2
    Letzter Beitrag: 26.05.06, 15:27