【问题标题】:How to word wrap inside a JTable row如何在 JTable 行中自动换行
【发布时间】:2016-06-11 20:40:55
【问题描述】:

我有一个简单的 JTable,它显示了另一个 JTable 中一行的详细信息(以列格式)。这很好用。但是,有时一行中的文本很长,因此用户最终不得不滚动浏览其中不整洁的内容。

如何将文本换行并允许更改行高以显示其中的所有文本。

代码如下:

 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    int selectedRow = table.getSelectedRow();
                    DefaultTableModel newModel = new DefaultTableModel();
                    String rowName = "Row: " + selectedRow;
                    newModel.setColumnIdentifiers(new Object[]{rowName});
                    for (int i = 0; i < table.getModel().getColumnCount(); i++) {
                        newModel.addRow(new Object[]{table.getModel().getValueAt(selectedRow, i)});
                    }
                    JTable newTable = new JTable(newModel) {
                        /**
                         * 
                         */
                        private static final long serialVersionUID = 1L;

                        @Override
                        public Dimension getPreferredScrollableViewportSize() {
                            return new Dimension(140, 240);
                        }
                    };
                    newTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                    newTable.setRowHeight(14, 30);
                    TableColumnAdjuster tcanewTable = new TableColumnAdjuster(newTable);        
                    tcanewTable.setColumnHeaderIncluded(true);
                    tcanewTable.setColumnDataIncluded(true);
                    tcanewTable.setOnlyAdjustLarger( true );
                    tcanewTable.setDynamicAdjustment( true );
                    tcanewTable.adjustColumns();

                    // Apply any custom renderers and editors
                    JOptionPane.showMessageDialog(frame, new JScrollPane(newTable),
                        rowName, JOptionPane.PLAIN_MESSAGE);
                }
            }
        });

【问题讨论】:

标签: java swing jtable


【解决方案1】:

您可以通过将JTextArea 用作表中该列的TableCellRenderer 来完成此操作。例如:

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;
    }
}

在表中使用WordWrapCellRenderer

table.getColumnModel().getColumn(columnIndex).setCellRenderer(new WordWrapCellRenderer());

【讨论】:

    【解决方案2】:

    这是已接受答案的更新。

    它通过限制getPreferredSize() 调用的数量来提高渲染器的效率。

    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() );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 2019-01-19
      • 2011-07-09
      • 2013-01-09
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多