JTable Swing:我无法通过在 header 中拖动光标来调整列的大小

JTable Swing: I cannot resize column by dragging cursor in header

我无法通过在 header 列之间移动光标并拖动分隔线来调整列宽,尽管我已将 setResizingAllowed() 设置为 true

tbResumen = new JTable();
tbResumen.setEnabled(false);

tbResumen.setRowHeight(20);
tbResumen.setBackground(UIManager.getColor("Table.selectionBackground"));
tbResumen.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
tbResumen.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
tbResumen.setFont(new Font("Arial", Font.PLAIN, 12));
tbResumen.setDefaultRenderer(Object.class, new RenderTablaInfo());
tbResumen.setOpaque(false);

tbResumen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tbResumen.setColumnSelectionAllowed(false);
tbResumen.setRowSelectionAllowed(true);

tbResumen.setSize(new Dimension(840, 450));
tbResumen.setPreferredScrollableViewportSize(new Dimension(840, 450));

tbResumen.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

tbResumen.setModel(new DefaultTableModel(new Object[][] {{ label1, label2, label3, label4} },
new String[] { "foo", "bar", "foobar", "barfoo" }));

final JTableHeader headerResumen = new JTableHeader();
headerResumen.setReorderingAllowed(false); 
headerResumen.setResizingAllowed(true);
headerResumen.setColumnModel(tbResumen.getColumnModel());

headerResumen.setTable(tbResumen);
tbResumen.setTableHeader(headerResumen);

如果有人需要更多代码来说明情况,我会尽快添加。谢谢。

不清楚您的片段哪里出错了。下面的最小竞争示例显示了一个 table ,其列可以调整大小但不能重新排序。特别要注意 tbResumen 显示在 JScrollPane.

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

/**
 * @see 
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTable tbResumen = new JTable();
        tbResumen.setPreferredScrollableViewportSize(new Dimension(400, 100));
        tbResumen.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        tbResumen.setModel(new DefaultTableModel(new Object[][]{
            {"label1", "label2", "label3", "label4"}},
            new String[]{"foo", "bar", "foobar", "barfoo"}));
        JTableHeader headerResumen = tbResumen.getTableHeader();
        headerResumen.setReorderingAllowed(false);

        f.add(new JScrollPane(tbResumen));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}
  1. 确保您的 header 是您要配置的那个。

所以,与:

JTableHeader headerResumen = tbResumen.getTableHeader();
headerResumen.setResizingAllowed(true);

我只是用我的 table 的 model 创建了另一个 header 并在那里进行配置,没有意识到 新的 header 我创建的不是我的 table。我必须调用 table.getTableHeader() 以获得我想要的 header 并且配置可以工作。抱歉我的愚蠢。

  1. 确保您已将鼠标悬停在该 table 列之间的边缘上时将光标设置为默认光标,这样您就可以看到它变成了 two-headed 箭头并且您知道它们是 adjustable.

    tbResumen.setCursor(Cursor.getPredefinedCursor(CURSOR_DEFAULT));

如果设置为CURSOR_HAND,则不会显示two-way光标。

  1. autoResizingMode也可以触发"problems",让调整宽度更难。当设置为OFF时,当你拖动列边缘时,它可能会移动,但不能自由移动。请务必将 autoResizingMode 设置为 JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNSJTable.AUTO_RESIZE_NEXT_COLUMN 以查看可观的变化。

  2. (半年后回过头来看还是觉得有用。。。) 如果禁用包含 table 的 JScrollPane,光标也不会改变,并且不会显示 two-way 光标。