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

时间:2016-07-22 07:59:20

标签: java swing jtable jtableheader

我无法通过在标题列之间移动光标来调整列宽,并拖动分隔符,尽管我已将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);

如果有人需要更多代码来澄清情况,我会尽快添加它们。谢谢。

2 个答案:

答案 0 :(得分:2)

不清楚你的片段出错了。下面的最小竞争示例显示了一个表,其列可以调整大小但不能重新排序。请特别注意,tbResumen中会显示JScrollPane

image

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 http://stackoverflow.com/a/38524632/230513
 */
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 :(得分:1)

  1. 确保您的标题是您要配置的标题。
  2. 所以,用:

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

    我只是使用我的表的model创建另一个标头并在那里进行配置,没有意识到我创建的新标头不是我的表格。我必须调用table.getTableHeader()来获取我想要的标题,配置才能正常工作。抱歉愚蠢。

    1. 确保在将鼠标悬停在此表中列之间的边缘时将光标设置为默认光标,这样您就可以看到它变为双向箭头,并且您知道它们是可调整的。

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

    2. 如果将其设置为CURSOR_HAND,则不会显示双向光标。

      1. autoResizingMode也会触发"问题" ,从而难以调整宽度。当它设置OFF时,拖动列边缘时,可能会移动它,但不能自由移动。请务必将autoResizingMode设置为JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNSJTable.AUTO_RESIZE_NEXT_COLUMN以查看相当大的更改。

      2. (半年后,当我回到我的答案时,我仍觉得它很有用......) 如果禁用包含该表的JScrollPane,则光标不会更改,也不会显示双向光标。