Java JTable内容换行

JTable是Java Swing库中的一个重要组件,用于显示和编辑表格数据。默认情况下,JTable中的单元格内容是单行显示的,但有时我们需要在单元格中显示多行文本。本文将介绍如何在JTable中实现内容换行,并提供代码示例。

JTable内容换行的需求

在某些情况下,表格中的某些单元格可能包含较长的文本,如果将所有文本都显示在一行中,可能会导致表格显示过宽,不美观。为了使表格更加美观,我们希望能够将单元格的内容自动换行显示。

使用DefaultTableCellRenderer实现内容换行

要在JTable中实现内容换行,我们可以通过自定义TableCellRenderer来实现。TableCellRenderer是一个接口,用于定义如何渲染表格中的单元格。DefaultTableCellRenderer是TableCellRenderer的默认实现,我们可以继承它来实现自己的渲染器。

下面是一个示例代码,演示如何使用DefaultTableCellRenderer实现内容换行:

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

public class LineWrapTableRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (cell instanceof JTextArea) {
            JTextArea textArea = (JTextArea) cell;
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);
        } else {
            JTextArea textArea = new JTextArea(cell.getText());
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);
            return textArea;
        }
        return cell;
    }
}

在上面的代码中,我们自定义了一个LineWrapTableRenderer类,继承了DefaultTableCellRenderer,并重写了getTableCellRendererComponent方法。在该方法中,我们首先调用父类的getTableCellRendererComponent方法获取默认的渲染组件。然后,我们将获取到的组件转换为JTextArea,并设置setLineWrap(true)和setWrapStyleWord(true)来实现内容换行。

如果单元格原本不是JTextArea类型,我们将其文本内容赋值给一个新创建的JTextArea,并设置setLineWrap(true)和setWrapStyleWord(true)。最后,返回渲染组件即可。

使用自定义的渲染器

要在JTable中使用自定义的渲染器,我们需要将其设置为表格列的渲染器。下面是一个示例代码,演示如何使用自定义的渲染器:

import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame {
    public MainFrame() {
        super("JTable Line Wrap Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[][] data = {
                {"1", "This is a long text that needs line wrap.", "Column 3"},
                {"2", "Another long text that also needs line wrap.", "Column 3"},
                {"3", "Short text", "Column 3"}
        };

        String[] columnNames = {"ID", "Text", "Column 3"};

        JTable table = new JTable(data, columnNames);
        table.getColumnModel().getColumn(1).setCellRenderer(new LineWrapTableRenderer());

        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);

        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            MainFrame frame = new MainFrame();
            frame.setVisible(true);
        });
    }
}

在上面的代码中,我们创建了一个JFrame,并向其中添加一个JTable。JTable的数据和列名通过构造函数传入。然后,我们使用table.getColumnModel().getColumn(1).setCellRenderer(new LineWrapTableRenderer())将第二列的渲染器设置为我们自定义的LineWrapTableRenderer。

最后,我们将JTable放在JScrollPane中,并将JScrollPane添加到JFrame中。通过这样的设置,JTable中的第二列单元格的内容将会自动换行显示。

完整代码

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

public class LineWrapTableRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)