Java 根据标题中的文本设置JTable的列宽

Java 根据标题中的文本设置JTable的列宽,java,swing,jtable,jtableheader,preferredsize,Java,Swing,Jtable,Jtableheader,Preferredsize,我需要根据标题中的文本获得适当的表大小。它包含捷克人名的缩写,如:“Po”、“Út”、“St”、atc。但不是显示这三个点 try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelExc

我需要根据标题中的文本获得适当的表大小。它包含捷克人名的缩写,如:“Po”、“Út”、“St”、atc。但不是显示这三个点

try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
}
我有以下代码:

宽度
高度
-所有最小行/列大小的最大值
allWidth
allHeight
-应为整个表格的总宽度和高度

//GET DIMENSION
int width = 0;
int height = 0;
int allWidth, allHeight;
for (int col = 0; col < table.getColumnCount(); col++) {        
    TableColumn tableColumn = table.getTableHeader().getColumnModel().getColumn(col);
    TableCellRenderer renderer = tableColumn.getHeaderRenderer();
    if (renderer == null) {
        renderer = table.getTableHeader().getDefaultRenderer();
    }
    Component component = renderer.getTableCellRendererComponent(table,
            tableColumn.getHeaderValue(), false, false, -1, col);
    width = Math.max(component.getPreferredSize().width, width);
    table.getColumnModel().getColumn(col).setPreferredWidth(width);
}
allWidth = table.getColumnCount() * width;
for (int row = 0; row < table.getRowCount(); row++) {
    TableCellRenderer renderer = table.getCellRenderer(row, 0);
    Component comp = table.prepareRenderer(renderer, row, 0);
    height = Math.max(comp.getMinimumSize().height, height);
}
allHeight = table.getRowCount() * height;

//HERE I SET WIDTHS AND HEIGHTS
table.setRowHeight(height);
table.setMinimumSize(new Dimension(allWidth, allHeight));
scrollPane.setMinimumSize(new Dimension(allWidth, allHeight));
我还改变了外观和感觉,这导致了这三个点。否则,将正确显示名称

try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
}
这就是我初始化JTable和JScrollPane的方式,我觉得这样也可以

    setTable(new JTable());
    getTable().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    getTable().setAutoscrolls(false);
    getTable().getTableHeader().setResizingAllowed(false);
    getTable().getTableHeader().setReorderingAllowed(false);
    getTable().setColumnSelectionAllowed(true);
    getTable().setRowSelectionAllowed(true);
    getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    tableModel = new CalendarTableModel();  //my class extended from AbstractTableModel
    getTable().setModel(tableModel);
    scrollPane = new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setAutoscrolls(false);
问题:
如果我没有将带有gbc的滚动窗格设置为自动调整大小,它将获得可能的最小大小,除非我手动计算并设置
滚动窗格
的最小大小。(左图)

使用这个设置,我得到的结果在中间PIC,但也太小。(没有日期名称,高度也稍微小一些。)
我不知道还有什么更好的方法可以做到这一点,到目前为止,我还没有发现任何东西对我有帮助。

当我考虑一些填充,例如2像素,并调整allWidth、allHeight的计算时,如下所示:

allHeight = (1+table.getRowCount()+pady) * height; //plus one line of header
allWidth = table.getColumnCount() * width;
table.getColumnModel().getColumn(col).setPreferredWidth(width);
我在右边看到了这张照片。

下面是一个简单完整的可编译类,演示了该问题:

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

public class Main {
    public static void main(String[] args) {
        new Main().start();
    }

    private void start() {
        JFrame f = new JFrame();
        f.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        initTable();

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
        }

        JPanel calendar = new JPanel();
        calendar.setLayout(new GridBagLayout());
        calendar.setBorder(BorderFactory.createTitledBorder("Calendar"));
        gbc.fill = GridBagConstraints.NONE;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weighty = 0;
        gbc.weightx = 0;
        calendar.add(scrollPane, gbc);

        f.add(calendar,gbc);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    JTable table;
    JScrollPane scrollPane;
    CalendarTableModel tableModel;

    private void initTable() {
        setTable(new JTable());
        getTable().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        getTable().setAutoscrolls(false);
        getTable().getTableHeader().setResizingAllowed(false);
        getTable().getTableHeader().setReorderingAllowed(false);
        getTable().setColumnSelectionAllowed(true);
        getTable().setRowSelectionAllowed(true);
        getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        tableModel = new CalendarTableModel();  //my class extended from AbstractTableModel
        getTable().setModel(tableModel);
        scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setAutoscrolls(false);

        //GET DIMENSION
        int width = 0;
        int height = 0;
        int allWidth, allHeight;
        int padx = 2,pady = 2;
        for (int col = 0; col < table.getColumnCount(); col++) {
            TableColumn tableColumn = table.getTableHeader().getColumnModel().getColumn(col);
            TableCellRenderer renderer = tableColumn.getHeaderRenderer();
            if (renderer == null) {
                renderer = table.getTableHeader().getDefaultRenderer();
            }
            Component component = renderer.getTableCellRendererComponent(table,
                    tableColumn.getHeaderValue(), false, false, -1, col);
            width = Math.max(component.getPreferredSize().width, width);
            table.getColumnModel().getColumn(col).setPreferredWidth(width);
        }
        allWidth = (table.getColumnCount()+padx) * width;
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, 0);
            Component comp = table.prepareRenderer(renderer, row, 0);
            height = Math.max(comp.getMinimumSize().height, height);
        }
        allHeight = (1+table.getRowCount()+pady) * height;

//HERE I SET WIDTHS AND HEIGHTS
        table.setRowHeight(height);
        table.setMinimumSize(new Dimension(allWidth, allHeight));
        scrollPane.setMinimumSize(new Dimension(allWidth, allHeight));
    }

    private void setTable(JTable jTable) {
        this.table = jTable;
    }

    private JTable getTable() {
        return this.table;
    }

    private class CalendarTableModel extends AbstractTableModel {
        private String[] daysData = {"Po", "Út", "St", "Čt", "Pá", "So", "Ne"};
        private int[][] values;

        public CalendarTableModel() {
            values = new int[7][6];
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    values[j][i] = 7;
                }
            }
        }

        @Override
        public int getRowCount() {
            return 6;
        }

        @Override
        public int getColumnCount() {
            return 7;
        }

        @Override
        public String getColumnName(int column) {
            return daysData[column];
        }

        @Override
        public Object getValueAt(int row, int column) {
            return this.values[column][row];
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    }
}
import java.awt.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共班机{
公共静态void main(字符串[]args){
新建Main().start();
}
私有void start(){
JFrame f=新的JFrame();
f、 setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
initTable();
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不受支持的ookandfeelException e){
}
JPanel calendar=新的JPanel();
setLayout(新的GridBagLayout());
calendar.setboorder(BorderFactory.createTitledBorder(“日历”));
gbc.fill=GridBagConstraints.NONE;
gbc.gridx=0;
gbc.gridy=0;
gbc.weighty=0;
gbc.weightx=0;
日历.添加(滚动窗格,gbc);
f、 添加(日历,gbc);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
JTable表;
JScrollPane滚动窗格;
日历表模型;
私有void initTable(){
可设置(新JTable());
getTable().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
getTable().setAutoscrolls(false);
getTable().getTableHeader().SetResizenGallowed(false);
getTable().getTableHeader().setReorderingAllowed(false);
getTable().setColumnSelectionAllowed(true);
getTable().setRowSelectionLowed(true);
getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableModel=new CalendarTableModel();//我的类从AbstractTableModel扩展而来
getTable().setModel(tableModel);
scrollPane=新的JScrollPane(表格,JScrollPane.VERTICAL\u SCROLLBAR\u NEVER,JScrollPane.HORIZONTAL\u SCROLLBAR\u NEVER);
滚动窗格。设置自动滚动(false);
//获取维度
整数宽度=0;
整数高度=0;
int-allWidth,allHeight;
int-padx=2,pady=2;
for(int col=0;col
您可以选择购买这一款

  • f.pack()

  • table.getColumnModel().getColumn(col).setPreferredWidth(width);
    
    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    
    jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF );
    
    for (int column = 0; column < jTable1.getColumnCount(); column++){
        TableColumn tableColumn = jTable1.getColumnModel().getColumn(column);
        int preferredWidth = tableColumn.getMinWidth();
        int maxWidth = 0;
        TableCellRenderer rend = jTable1.getTableHeader().getDefaultRenderer();
        TableCellRenderer rendCol = tableColumn.getHeaderRenderer();
        if (rendCol == null) rendCol = rend;
        Component header = rendCol.getTableCellRendererComponent(jTable1, tableColumn.getHeaderValue(), false, false, 0, column);
        maxWidth = header.getPreferredSize().width;
        System.out.println("maxWidth :"+maxWidth);
    
        for (int row = 0; row < jTable1.getRowCount(); row++){
            TableCellRenderer cellRenderer = jTable1.getCellRenderer(row, column);
            Component c = jTable1.prepareRenderer(cellRenderer, row, column);
            int width = c.getPreferredSize().width + jTable1.getIntercellSpacing().width;
            preferredWidth = Math.max(preferredWidth, width);
            System.out.println("preferredWidth :"+preferredWidth);
            System.out.println("Width :"+width);
    
            //  We've exceeded the maximum width, no need to check other rows
    
            if (preferredWidth <= maxWidth){
                preferredWidth = maxWidth;
                break;
            }
        }
        tableColumn.setPreferredWidth(preferredWidth);
    }