如何在JTable / JXTable中设置列宽?

时间:2013-03-01 13:13:55

标签: java swing jtable column-width jxtable

我的应用程序由几个JTables组成。 JXTables。目标是存储列宽并在启动时重新加载它们。

但是下面的代码对表的列宽没有任何改变:

tblTasks.getColumn(1).setWidth(36);

并且这个没有做任何事情:

tblTasks.getColumn(1).setPreferredWidth(36);

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

  

但是下面的代码没有改变列的宽度   表:

tblTasks.getColumn(1).setWidth(36);
     

并且这个没有做任何事情:

tblTasks.getColumn(1).setPreferredWidth(36);
     

有什么想法吗?

正确的构造函数是JTable.getColumnModel().getColumn(0).setPreferredWidth(36);

例如

enter image description here

enter image description here

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class TableRowHeight {

    private static final long serialVersionUID = 1L;
    private JFrame frame = new JFrame("p*s*s*s*s*t*t");
    private String[] columnNames = {"one", "two", "Playing with", "four", "five",};
    private String[][] data = {
        {"aaaaaa", "bbbbbb", "cccccc", "dddddd", "eeeeeee",},
        {"bbbbbb", "cccccc", "dddddd", "eeeeeee", "aaaaaa",},
        {"cccccc", "dddddd", "eeeeeee", "aaaaaa", "bbbbbb",},
        {"dddddd", "eeeeeee", "aaaaaa", "bbbbbb", "cccccc",},
        {"eeeeeee", "aaaaaa", "bbbbbb", "cccccc", "dddddd",}};
    private JTable table = new JTable(new DefaultTableModel(data, columnNames));
    private TableColumnModel tcm = table.getColumnModel();
    private Stack<TableColumn> colDeleted = new Stack<TableColumn>();
    private JButton restoreButton = new JButton("Restore Column Size");
    private JButton hideButton = new JButton("Set Column Size to Zero");
    private JButton deleteButton = new JButton("Delete Column");
    private JButton addButton = new JButton("Restore Column");

    public TableRowHeight() {
        table.setRowMargin(4);
        table.setRowHeight(30);
        table.setFont(new Font("SansSerif", Font.BOLD + Font.PLAIN, 20));
        JScrollPane scrollPane = new JScrollPane(table);
        for (int i = 0; i < (tcm.getColumnCount()); i++) {
            tcm.getColumn(i).setPreferredWidth(150);
        }
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        restoreButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                tcm.getColumn(2).setPreferredWidth(100);
            }
        });
        hideButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                tcm.getColumn(2).setPreferredWidth(000);
            }
        });
        deleteButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (table.getColumnCount() > 0) {
                    TableColumn colToDelete = table.getColumnModel().getColumn(table.getColumnCount() - 1);
                    table.removeColumn(colToDelete);
                    table.validate();
                    colDeleted.push(colToDelete);
                    addButton.setEnabled(true);
                } else {
                    deleteButton.setEnabled(false);
                }
            }
        });
        addButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (colDeleted.size() > 0) {
                    table.addColumn(colDeleted.pop());
                    table.validate();
                    deleteButton.setEnabled(true);
                } else {
                    addButton.setEnabled(false);
                }
            }
        });
        JPanel btnPanel = new JPanel();
        btnPanel.add(hideButton);
        btnPanel.add(restoreButton);
        btnPanel.add(deleteButton);
        btnPanel.add(addButton);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.add(btnPanel, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TableRowHeight frame = new TableRowHeight();
            }
        });
    }
}

答案 1 :(得分:3)

table.getColumn("Column Name").setMaxWidth(36);

答案 2 :(得分:2)

我所做的是将最小宽度设置为每列的值。对于最后一列的首选宽度,我选择Integer.MAX_VALUE,它会将所有其他列推送到最小列。

这是我项目的片段:

ruleTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
ruleTable.getColumnModel().getColumn(0).setMinWidth(25);
ruleTable.getColumnModel().getColumn(1).setMinWidth(125);
ruleTable.getColumnModel().getColumn(2).setMinWidth(175);
ruleTable.getColumnModel().getColumn(2).setMaxWidth(Integer.MAX_VALUE);

希望它会对你和其他人有所帮助......对你来说可能有点晚了;-P

答案 3 :(得分:1)

table.getColumn("Column Name").setMinWidth(36);