Java如何设置或更改JTable列宽?

JTable组件的每一列均由TableColumn类表示。用于设置或改变列的宽度,该方法包括setMinWidth(),setMaxWidth()和setPreferredWidth()。这些方法分别用于设置列的最小,最大和首选宽度。

当我们仅设置表列的首选宽度并且容器得到调整大小时,首选宽度将用于重新计算新的列宽度以填充可用空间,但是首选宽度值本身不会更改。

TableColumn可以通过调用getColumnModel()返回的实例的表的方法来获得表的对象TableColumnModel。接手之后,TableColumModel我们可以通过调用getColumn(int index)方法并传递列的来获取表的index列。

package org.nhooo.example.swing;

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

public class TableColumnWidthDemo extends JPanel {
    public TableColumnWidthDemo() {
        initializePanel();
    }

    private void initializePanel() {
        // 定义表的列名。
        String[] columnNames = {
            "TEAM", "P", "W", "D", "L", "GS", "GA", "GD", "PTS"
        };

        // 定义表的数据。
        Object[][] data = {
            { "Liverpool", 3, 3, 0, 0, 7, 0, 7, 9 },
            { "Tottenham", 3, 3, 0, 0, 8, 2, 6, 9 },
            { "Chelsea", 3, 3, 0, 0, 8, 3, 5, 9 },
            { "Watford", 3, 3, 0, 0, 7, 2, 5, 9 },
            { "Manchester City", 3, 2, 1, 0, 9, 2, 7, 7 }
        };

        // 定义表格的列宽。
        int[] columnsWidth = {
            200, 25, 25, 25, 25, 25, 25, 25, 50
        };

        // 创建JTable的实例并用数据填充它,
        // 列名称信息。
        JTable table = new JTable(data, columnNames);

        // 配置表的列宽。
        int i = 0;
        for (int width : columnsWidth) {
            TableColumn column = table.getColumnModel().getColumn(i++);
            column.setMinWidth(width);
            column.setMaxWidth(width);
            column.setPreferredWidth(width);
        }

        JScrollPane scrollPane = new JScrollPane(table);
        table.setFillsViewportHeight(true);
        this.setLayout(new BorderLayout());
        this.add(scrollPane, BorderLayout.CENTER);
        this.setPreferredSize(new Dimension(500, 200));
    }

    public static void showFrame() {
        JPanel panel = new TableColumnWidthDemo();
        panel.setOpaque(true);

        // 创建并配置我们的JFrame组件
        // 程序。
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.setTitle("English Premiere League - 2018/2019");
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                showFrame();
            }
        });
    }
}

这是上面的程序创建的表:

JTable列宽演示