Java 调整标题表的大小

Java 调整标题表的大小,java,swing,jtable,Java,Swing,Jtable,我的桌子有两个问题。我设法给行添加了一个标题。但是,即使我正在使用headerTable.setAutoResizeModeJTable.AUTO_RESIZE_ALL_COLUMNS),它们也不会自行调整大小。此外,即使我在表格模型中设置了我的列名,也不会显示它们 下面是一个简短的示例程序: import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueu

我的桌子有两个问题。我设法给行添加了一个标题。但是,即使我正在使用
headerTable.setAutoResizeModeJTable.AUTO_RESIZE_ALL_COLUMNS),它们也不会自行调整大小。此外,即使我在表格模型中设置了我的
列名,也不会显示它们

下面是一个简短的示例程序:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.RowSorterEvent;
import javax.swing.event.RowSorterListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class JTableRowHeader {

    private JFrame frame = new JFrame("JTable RowHeader");
    private JScrollPane scrollPane;
    private JTable table;
    private DefaultTableModel model;
    private TableRowSorter<TableModel> sorter;
    private JTable headerTable;

    public JTableRowHeader() {
        table = new JTable(5, 10);
        for (int i = 0; i < table.getRowCount(); i++) {
            System.out.println(i);
            for (int a = 0; a < table.getColumnCount(); a++) {  
                System.out.println(a);
                table.setValueAt(a, i, a);
            }
        }

        sorter = new TableRowSorter<TableModel>(table.getModel());
        table.setRowSorter(sorter);
        model = new DefaultTableModel() {

            /**
             * UUID
             */
            private static final long serialVersionUID = 2797195270050411045L;

            private String[] columnNames = {"test1", "test2", "test3", "test3", "test5"};

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

            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }

            @Override 
            public String getColumnName(int index) { 
                return columnNames[index]; 
            } 

            @Override
            public int getRowCount() {
                return table.getRowCount();
            }

            @Override
            public Class<?> getColumnClass(int colNum) {
                switch (colNum) {
                case 0:
                    return String.class;
                default:
                    return super.getColumnClass(colNum);
                }
            }
        };
        //set table headers
        headerTable = new JTable(model);
        headerTable.setValueAt("Costs", 0, 0);
        headerTable.setValueAt("Product", 1, 0);
        headerTable.setValueAt("Table", 2, 0);
        headerTable.setValueAt("Risk", 3, 0);
        headerTable.setValueAt("Equity", 4, 0);

        headerTable.setShowGrid(true);
        headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        headerTable.setPreferredScrollableViewportSize(new Dimension(50, 0));
        headerTable.getColumnModel().getColumn(0).setPreferredWidth(50);
        headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

                boolean selected = table.getSelectionModel().isSelectedIndex(row);
                Component component = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, false, false, -1, -2);
                ((JLabel) component).setHorizontalAlignment(SwingConstants.CENTER);
                if (selected) {
                    component.setFont(component.getFont().deriveFont(Font.BOLD));
                    component.setForeground(Color.red);
                } else {
                    component.setFont(component.getFont().deriveFont(Font.PLAIN));
                }
                return component;
            }
        });
        table.getRowSorter().addRowSorterListener(new RowSorterListener() {

            @Override
            public void sorterChanged(RowSorterEvent e) {
                model.fireTableDataChanged();
            }
        });
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                model.fireTableRowsUpdated(0, model.getRowCount() - 1);
            }
        });
        scrollPane = new JScrollPane(table);
        scrollPane.setRowHeaderView(headerTable);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollPane);

        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            //e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JTableRowHeader TestTableRowHeader = new JTableRowHeader();
            }
        });
    }
}
您可以看到它们是由以下部分组成的:

更新2

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.RowSorterEvent;
import javax.swing.event.RowSorterListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class JTableRowHeader {

    private JFrame frame = new JFrame("JTable RowHeader");
    private JScrollPane scrollPane;
    private JTable table;
    private DefaultTableModel model;
    private TableRowSorter<TableModel> sorter;
    private JTable headerTable;

    public JTableRowHeader() {
        table = new JTable(5, 10);
        for (int i = 0; i < table.getRowCount(); i++) {
            System.out.println(i);
            for (int a = 0; a < table.getColumnCount(); a++) {  
                System.out.println(a);
                table.setValueAt(a, i, a);
            }
        }

        sorter = new TableRowSorter<TableModel>(table.getModel());
        table.setRowSorter(sorter);
        model = new DefaultTableModel() {

            /**
             * UUID
             */
            private static final long serialVersionUID = 2797195270050411045L;

            private String[] columnNames = {"test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8", "test9", "test10"};

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

            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }

            @Override 
            public String getColumnName(int index) { 
                return columnNames[index]; 
            } 

            @Override
            public int getRowCount() {
                return table.getRowCount();
            }

            @Override
            public Class<?> getColumnClass(int colNum) {
                switch (colNum) {
                case 0:
                    return String.class;
                default:
                    return super.getColumnClass(colNum);
                }
            }
        };
        //set table headers
        headerTable = new JTable(model);
        headerTable.setValueAt("Costs and Sales", 0, 0);
        headerTable.setValueAt("Product", 1, 0);
        headerTable.setValueAt("Table 234", 2, 0);
        headerTable.setValueAt("Risk and Equity", 3, 0);
        headerTable.setValueAt("Equity in million", 4, 0);

        headerTable.setShowGrid(false);
        headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
        headerTable.setPreferredScrollableViewportSize(new Dimension(50, 0));
        headerTable.getColumnModel().getColumn(0).setPreferredWidth(50);
        headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

                boolean selected = table.getSelectionModel().isSelectedIndex(row);
                Component component = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, false, false, -1, -2);
                ((JLabel) component).setHorizontalAlignment(SwingConstants.CENTER);
                if (selected) {
                    component.setFont(component.getFont().deriveFont(Font.BOLD));
                    component.setForeground(Color.red);
                } else {
                    component.setFont(component.getFont().deriveFont(Font.PLAIN));
                }
                return component;
            }
        });
        table.getRowSorter().addRowSorterListener(new RowSorterListener() {

            @Override
            public void sorterChanged(RowSorterEvent e) {
                model.fireTableDataChanged();
            }
        });
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                model.fireTableRowsUpdated(0, model.getRowCount() - 1);
            }
        });
        scrollPane = new JScrollPane(table);
        scrollPane.setRowHeaderView(headerTable);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollPane);

        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            //e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JTableRowHeader TestTableRowHeader = new JTableRowHeader();
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Font;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingConstants;
导入javax.swing.UIManager;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
导入javax.swing.event.RowsortRevent;
导入javax.swing.event.RowSorterListener;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellRenderer;
导入javax.swing.table.TableModel;
导入javax.swing.table.TableRowSorter;
公共类JTableRowHeader{
私有JFrame=newjframe(“JTable行标题”);
私有JScrollPane滚动窗格;
专用JTable表;
私有模型;
私人桌面分拣机;
私人JTable headerTable;
公共JTableRowHeader(){
表=新的JTable(5,10);
对于(int i=0;i

您可以看到,当添加足够多的列时,我的列名称保持不变。此外,我的标题表无法调整大小

谢谢你的回复

此外,即使我设置了列名,也不会显示它们 在表格模型中

import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.RowSorterEvent; import javax.swing.event.RowSorterListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class JTableRowHeader { private JFrame frame = new JFrame("JTable RowHeader"); private JScrollPane scrollPane; private JTable table; private DefaultTableModel model; private TableRowSorter<TableModel> sorter; private JTable headerTable; public JTableRowHeader() { table = new JTable(5, 10); for (int i = 0; i < table.getRowCount(); i++) { System.out.println(i); for (int a = 0; a < table.getColumnCount(); a++) { System.out.println(a); table.setValueAt(a, i, a); } } sorter = new TableRowSorter<TableModel>(table.getModel()); table.setRowSorter(sorter); model = new DefaultTableModel() { /** * UUID */ private static final long serialVersionUID = 2797195270050411045L; private String[] columnNames = {"test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8", "test9", "test10"}; @Override public int getColumnCount() { return 1; } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public String getColumnName(int index) { return columnNames[index]; } @Override public int getRowCount() { return table.getRowCount(); } @Override public Class<?> getColumnClass(int colNum) { switch (colNum) { case 0: return String.class; default: return super.getColumnClass(colNum); } } }; //set table headers headerTable = new JTable(model); headerTable.setValueAt("Costs and Sales", 0, 0); headerTable.setValueAt("Product", 1, 0); headerTable.setValueAt("Table 234", 2, 0); headerTable.setValueAt("Risk and Equity", 3, 0); headerTable.setValueAt("Equity in million", 4, 0); headerTable.setShowGrid(false); headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); headerTable.setPreferredScrollableViewportSize(new Dimension(50, 0)); headerTable.getColumnModel().getColumn(0).setPreferredWidth(50); headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) { boolean selected = table.getSelectionModel().isSelectedIndex(row); Component component = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, false, false, -1, -2); ((JLabel) component).setHorizontalAlignment(SwingConstants.CENTER); if (selected) { component.setFont(component.getFont().deriveFont(Font.BOLD)); component.setForeground(Color.red); } else { component.setFont(component.getFont().deriveFont(Font.PLAIN)); } return component; } }); table.getRowSorter().addRowSorterListener(new RowSorterListener() { @Override public void sorterChanged(RowSorterEvent e) { model.fireTableDataChanged(); } }); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { model.fireTableRowsUpdated(0, model.getRowCount() - 1); } }); scrollPane = new JScrollPane(table); scrollPane.setRowHeaderView(headerTable); table.setPreferredScrollableViewportSize(table.getPreferredSize()); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.add(scrollPane); frame.pack(); frame.setLocation(150, 150); frame.setVisible(true); } public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { //e.printStackTrace(); } EventQueue.invokeLater(new Runnable() { @Override public void run() { JTableRowHeader TestTableRowHeader = new JTableRowHeader(); } }); } }
headerTable.setAutoResizeModeJTable.AUTO_RESIZE_ALL_COLUMNS);.
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.UIManager.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class JTableRowHeader {

    private JFrame frame = new JFrame("JTable RowHeader");
    private JScrollPane scrollPane;
    private JTable table;
    private DefaultTableModel dataModel;
    private DefaultTableModel model;
    private TableRowSorter<TableModel> sorter;
    private JTable headerTable;
    private String[] columnNames = {"test1", "test2", "test3", "test3"};

    public JTableRowHeader() {
        table = new JTable(4, 4);
        dataModel = (DefaultTableModel) table.getModel();
        for (int i = 0; i < dataModel.getRowCount(); i++) {
            for (int ii = 0; ii < dataModel.getRowCount(); ii++) {
                dataModel.setValueAt(i + ii, i, ii);
            }
        }
        TableColumnModel tcm = table.getColumnModel();        
        tcm.getColumn(0).setHeaderValue(columnNames[0]);
        tcm.getColumn(1).setHeaderValue(columnNames[1]);
        tcm.getColumn(2).setHeaderValue(columnNames[2]);
        tcm.getColumn(3).setHeaderValue(columnNames[3]);
        sorter = new TableRowSorter<TableModel>(table.getModel());
        table.setRowSorter(sorter);
        model = new DefaultTableModel() {
            private static final long serialVersionUID = 1L;

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

            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }

            @Override
            public int getRowCount() {
                return table.getRowCount();
            }

            @Override
            public Class<?> getColumnClass(int colNum) {
                switch (colNum) {
                    case 0:
                        return String.class;
                    default:
                        return super.getColumnClass(colNum);
                }
            }
        };
        headerTable = new JTable(model);
        for (int i = 0; i < table.getRowCount(); i++) {
            headerTable.setValueAt("Row " + (i + 1), i, 0);
        }
        headerTable.setShowGrid(false);
        headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        headerTable.setPreferredScrollableViewportSize(new Dimension(50, 0));
        headerTable.getColumnModel().getColumn(0).setPreferredWidth(50);
        headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

                boolean selected = table.getSelectionModel().isSelectedIndex(row);
                Component component = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, false, false, -1, -2);
                ((JLabel) component).setHorizontalAlignment(SwingConstants.CENTER);
                if (selected) {
                    component.setFont(component.getFont().deriveFont(Font.BOLD));
                    component.setForeground(Color.red);
                } else {
                    component.setFont(component.getFont().deriveFont(Font.PLAIN));
                }
                return component;
            }
        });
        table.getRowSorter().addRowSorterListener(new RowSorterListener() {
            @Override
            public void sorterChanged(RowSorterEvent e) {
                model.fireTableDataChanged();
            }
        });
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                model.fireTableRowsUpdated(0, model.getRowCount() - 1);
            }
        });
        scrollPane = new JScrollPane(table);
        scrollPane.setRowHeaderView(headerTable);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollPane);
        frame.add(new JButton(new AbstractAction("Toggle filter") {
            private static final long serialVersionUID = 1L;
            private RowFilter<TableModel, Object> filter = new RowFilter<TableModel, Object>() {
                @Override
                public boolean include(javax.swing.RowFilter.Entry<? extends TableModel, ? extends Object> entry) {
                    return ((Number) entry.getValue(0)).intValue() % 2 == 0;
                }
            };

            @Override
            public void actionPerformed(ActionEvent e) {
                if (sorter.getRowFilter() != null) {
                    sorter.setRowFilter(null);
                } else {
                    sorter.setRowFilter(filter);
                }
            }
        }), BorderLayout.SOUTH);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if (info.getName().equals("Nimbus")) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            //e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTableRowHeader TestTableRowHeader = new JTableRowHeader();
            }
        });
    }
}