Resize JTable to fit number of rows

前端 未结 2 1305
伪装坚强ぢ
伪装坚强ぢ 2021-01-29 10:46

I have a JTable which would be populated dynamically and I want the table to always resize to fit the number of rows. I don\'t want any scrolling because the table

相关标签:
2条回答
  • 2021-01-29 11:09

    Override getPreferredScrollableViewportSize() to return a multiple of the product of line height and row count. Each time a row is added, pack() the enclosing window.

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    
    /**
     * @see http://stackoverflow.com/a/37343900/230513
     * @see http://stackoverflow.com/a/37318673/230513
     */
    public class Test {
    
        private void display() {
            JFrame f = new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            class MyTableModel extends AbstractTableModel {
    
                private int n = 8;
    
                private void addRow() {
                    n++;
                    fireTableRowsInserted(n - 1, n - 1);
                }
    
                @Override
                public int getRowCount() {
                    return n;
                }
    
                @Override
                public int getColumnCount() {
                    return 4;
                }
    
                @Override
                public Object getValueAt(int rowIndex, int colIndex) {
                    return "R" + rowIndex + ":C" + colIndex;
                }
            };
            MyTableModel model = new MyTableModel();
            JTable table = new JTable(model) {
                @Override
                public Dimension getPreferredScrollableViewportSize() {
                    return new Dimension(super.getPreferredSize().width,
                        getRowHeight() * getRowCount());
                }
            };
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            f.add(new JScrollPane(table));
            f.add(new JButton(new AbstractAction("Add Row") {
                @Override
                public void actionPerformed(ActionEvent e) {
                    model.addRow();
                    f.pack();
                }
            }), BorderLayout.SOUTH);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Test()::display);
        }
    }
    
    0 讨论(0)
  • 2021-01-29 11:20

    I don't think this is the best way. But as you insist i have put the code below.

    import javax.swing.RowFilter;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableRowSorter;
    
    /**
     *
     * @author user
     */
    public class MyFrame extends javax.swing.JFrame {
    
        private DefaultTableModel model = null;
    
        TableRowSorter<DefaultTableModel> sorter = null;
    
        /**
         * Creates new form MyFrame
         */
        public MyFrame() {
            initComponents();
            model = new DefaultTableModel(null, new String[]{
                "Name", "age", "salary"
            });
            jTable1.setModel(model);
            for (int i = 0; i < 10; i++) {
                model.addRow(new Object[]{"Beniton", 34, 10000});
                model.addRow(new Object[]{"Joema", 33, 10000});
            }
            sorter = new TableRowSorter<DefaultTableModel>(model);
            jTable1.setRowSorter(sorter);
            int rowCount = model.getRowCount();
            this.setSize(this.getWidth(), 50+ (jTable1.getRowHeight()*(rowCount+1)));
        }
    
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
            java.awt.GridBagConstraints gridBagConstraints;
    
            jLabel1 = new javax.swing.JLabel();
            searchBox = new javax.swing.JTextField();
            jTable1 = new javax.swing.JTable();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            getContentPane().setLayout(new java.awt.GridBagLayout());
    
            jLabel1.setText("Search");
            getContentPane().add(jLabel1, new java.awt.GridBagConstraints());
    
            searchBox.setMaximumSize(new java.awt.Dimension(150, 20));
            searchBox.setMinimumSize(new java.awt.Dimension(150, 20));
            searchBox.setName("searchField"); // NOI18N
            searchBox.setPreferredSize(new java.awt.Dimension(150, 20));
            searchBox.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    searchBoxActionPerformed(evt);
                }
            });
            gridBagConstraints = new java.awt.GridBagConstraints();
            gridBagConstraints.gridx = 1;
            gridBagConstraints.gridy = 0;
            gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
            gridBagConstraints.weightx = 1.0;
            gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
            getContentPane().add(searchBox, gridBagConstraints);
            searchBox.getAccessibleContext().setAccessibleName("");
    
            jTable1.setModel(new javax.swing.table.DefaultTableModel(
                new Object [][] {
                    {null, null, null, null},
                    {null, null, null, null},
                    {null, null, null, null},
                    {null, null, null, null}
                },
                new String [] {
                    "Title 1", "Title 2", "Title 3", "Title 4"
                }
            ));
            gridBagConstraints = new java.awt.GridBagConstraints();
            gridBagConstraints.gridx = 0;
            gridBagConstraints.gridy = 1;
            gridBagConstraints.gridwidth = 2;
            gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
            gridBagConstraints.weightx = 1.0;
            gridBagConstraints.weighty = 1.0;
            getContentPane().add(jTable1, gridBagConstraints);
    
            pack();
        }// </editor-fold>                        
    
        private void searchBoxActionPerformed(java.awt.event.ActionEvent evt) {                                          
            if (searchBox.getText().length() > 0) {
                Integer value = Integer.parseInt(searchBox.getText());
                // Checking the age as Index is 1
                RowFilter<DefaultTableModel, Integer> rf = RowFilter.numberFilter(RowFilter.ComparisonType.BEFORE, value, 1);
                sorter.setRowFilter(rf);
            } else {
                sorter.setRowFilter(null);
            }
        }                                         
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new MyFrame().setVisible(true);
                }
            });
        }
    
        // Variables declaration - do not modify                     
        private javax.swing.JLabel jLabel1;
        private javax.swing.JTable jTable1;
        private javax.swing.JTextField searchBox;
        // End of variables declaration                   
    }
    
    0 讨论(0)
提交回复
热议问题