How to wrap lines in a jtable cell?

前端 未结 8 1026
面向向阳花
面向向阳花 2020-11-29 09:11

I\'m trying to implement a custom TableRenderer as described in this tutorial. I\'d like to have the renderer line-wrap each text that is to long for the given cell. The i

相关标签:
8条回答
  • 2020-11-29 09:49

    As noted above the row height needs to be calculated but the current solution could be improved. In fact, it wasn't working for me. jtxt.getColumns() was returning zero causing a divide by zero. Here's some code I think is cleaner:

    // set the width on the jTextArea causing a calc of preferred height
    jtxt.setSize(table.getWidth(), Short.MAX_VALUE);
    int prefH = jtxt.getPreferredSize().height;
    table.setRowHeight(row, prefH);
    
    0 讨论(0)
  • 2020-11-29 09:54

    In addition to this question I'd like to share with you solution for multiline cell editor. It's a bit hacky (stores reference to edited row), but does the job.

    import javax.swing.*;
    import javax.swing.table.TableCellEditor;
    import java.awt.*;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    
    class MultilineTableCellEditor extends AbstractCellEditor implements TableCellEditor {
    
        JComponent component = new JTextArea();
        JTable table;
        int lastRowIndex;
    
        public MultilineTableCellEditor() {
            JTextArea textArea = ((JTextArea) component);
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);
            textArea.addComponentListener(new ComponentAdapter() {
                @Override
                public void componentResized(ComponentEvent e) {
                    super.componentResized(e);
                    table.setRowHeight(lastRowIndex, (int) (textArea.getPreferredSize().getHeight()));
                }
            });
            textArea.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent e) {
                    super.keyTyped(e);
                    table.setRowHeight(lastRowIndex, (int) (textArea.getPreferredSize().getHeight()));
                }
            });
        }
    
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
                                                     int rowIndex, int vColIndex) {
            this.table = table;
            lastRowIndex = rowIndex;
    
            ((JTextArea) component).setText((String) value);
            component.setFont(table.getFont());
    
            return component;
        }
    
        public Object getCellEditorValue() {
            return ((JTextArea) component).getText();
        }
    }
    

    Used as so:

        JTable table = new JTable(tableModel) {
            // Cell renderer by Alessandro Rossi (posted as solution to this question)
            MultilineTableCell renderer = new MultilineTableCell();
            MultilineTableCellEditor editor = new MultilineTableCellEditor();
    
            @Override
            public TableCellRenderer getCellRenderer(int row, int column) {
                if (column == multilineColumn) {
                    return renderer;
                }
                return super.getCellRenderer(row, column);
            }
    
            @Override
            public TableCellEditor getCellEditor(int row, int column) {
                if ( column == multilineColumn ) {
                    return editor;
                }
                return super.getCellEditor(row, column);
            }
        };
    
    0 讨论(0)
提交回复
热议问题