我无法通过在标题列之间移动光标来调整列宽,并拖动分隔符,尽管我已将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);
如果有人需要更多代码来澄清情况,我会尽快添加它们。谢谢。
答案 0 :(得分:2)
不清楚你的片段出错了。下面的最小竞争示例显示了一个表,其列可以调整大小但不能重新排序。请特别注意,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 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)
所以,用:
JTableHeader headerResumen = tbResumen.getTableHeader();
headerResumen.setResizingAllowed(true);
我只是使用我的表的model
创建另一个标头并在那里进行配置,没有意识到我创建的新标头不是我的表格。我必须调用table.getTableHeader()
来获取我想要的标题,配置才能正常工作。抱歉愚蠢。
确保在将鼠标悬停在此表中列之间的边缘时将光标设置为默认光标,这样您就可以看到它变为双向箭头,并且您知道它们是可调整的。
tbResumen.setCursor(Cursor.getPredefinedCursor(CURSOR_DEFAULT));
如果将其设置为CURSOR_HAND
,则不会显示双向光标。
autoResizingMode
也会触发"问题" ,从而难以调整宽度。当它设置OFF
时,拖动列边缘时,可能会移动它,但不能自由移动。请务必将autoResizingMode
设置为JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS
或JTable.AUTO_RESIZE_NEXT_COLUMN
以查看相当大的更改。
(半年后,当我回到我的答案时,我仍觉得它很有用......)
如果禁用包含该表的JScrollPane
,则光标不会更改,也不会显示双向光标。