How to word wrap inside a JTable row

后端 未结 2 379
耶瑟儿~
耶瑟儿~ 2021-01-14 02:00

I have a simple JTable that shows the details (in column format) of a row from another JTable. This works nicely. However, sometimes the text in a row is very long so the us

相关标签:
2条回答
  • 2021-01-14 02:41

    This is an update of the accepted answer.

    It makes the renderer more efficient by limiting the number of getPreferredSize() calls.

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    /**
     *  The WordWrapRenderer can be used as a renderer for a JTable column. It will
     *  allow the text to wrap to a new line and adjust the table row height.
     *
     *  Note. This renderer can only be used for a single column in the table.
     */
    public class WordWrapRenderer extends JTextArea implements TableCellRenderer
    {
        WordWrapRenderer()
        {
            setLineWrap(true);
            setWrapStyleWord(true);
        }
    
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            setText( (value == null) ? "" : value.toString() );
            setSize(table.getColumnModel().getColumn(column).getWidth(), table.getRowHeight(row));
    
            //  Recalculate the preferred height now that the text and renderer width have been set.
    
            int preferredHeight = getPreferredSize().height;
    
            if (table.getRowHeight(row) != preferredHeight)
            {
                table.setRowHeight(row, preferredHeight);
            }
    
            return this;
        }
    
        private static void createAndShowGUI()
        {
            JTable table = new JTable(2, 3);
            table.setValueAt("A", 0, 0);
            table.setValueAt("This text should wrap by default", 0, 1);
    
            table.getColumnModel().getColumn(1).setCellRenderer( new WordWrapRenderer() );
    
            JFrame frame = new JFrame("TableBasic");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new JScrollPane( table ) );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
        }
    }
    
    0 讨论(0)
  • 2021-01-14 02:45

    You can accomplish this by using a JTextArea as a TableCellRenderer for that column in your table. For example:

    static class WordWrapCellRenderer extends JTextArea implements TableCellRenderer {
        WordWrapCellRenderer() {
            setLineWrap(true);
            setWrapStyleWord(true);
        }
    
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setText(value.toString());
            setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);
            if (table.getRowHeight(row) != getPreferredSize().height) {
                table.setRowHeight(row, getPreferredSize().height);
            }
            return this;
        }
    }
    

    To use WordWrapCellRenderer in your table:

    table.getColumnModel().getColumn(columnIndex).setCellRenderer(new WordWrapCellRenderer());
    
    0 讨论(0)
提交回复
热议问题