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);
}
}
- 确保您的 header 是您要配置的那个。
所以,与:
JTableHeader headerResumen = tbResumen.getTableHeader();
headerResumen.setResizingAllowed(true);
我只是用我的 table 的 model
创建了另一个 header 并在那里进行配置,没有意识到 新的 header 我创建的不是我的 table。我必须调用 table.getTableHeader()
以获得我想要的 header 并且配置可以工作。抱歉我的愚蠢。
确保您已将鼠标悬停在该 table 列之间的边缘上时将光标设置为默认光标,这样您就可以看到它变成了 two-headed 箭头并且您知道它们是 adjustable.
tbResumen.setCursor(Cursor.getPredefinedCursor(CURSOR_DEFAULT));
如果设置为CURSOR_HAND
,则不会显示two-way光标。
autoResizingMode
也可以触发"problems",让调整宽度更难。当设置为OFF
时,当你拖动列边缘时,它可能会移动,但不能自由移动。请务必将 autoResizingMode
设置为 JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS
或 JTable.AUTO_RESIZE_NEXT_COLUMN
以查看可观的变化。
(半年后回过头来看还是觉得有用。。。)
如果禁用包含 table 的 JScrollPane
,光标也不会改变,并且不会显示 two-way 光标。
我无法通过在 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);
}
}
- 确保您的 header 是您要配置的那个。
所以,与:
JTableHeader headerResumen = tbResumen.getTableHeader();
headerResumen.setResizingAllowed(true);
我只是用我的 table 的 model
创建了另一个 header 并在那里进行配置,没有意识到 新的 header 我创建的不是我的 table。我必须调用 table.getTableHeader()
以获得我想要的 header 并且配置可以工作。抱歉我的愚蠢。
确保您已将鼠标悬停在该 table 列之间的边缘上时将光标设置为默认光标,这样您就可以看到它变成了 two-headed 箭头并且您知道它们是 adjustable.
tbResumen.setCursor(Cursor.getPredefinedCursor(CURSOR_DEFAULT));
如果设置为CURSOR_HAND
,则不会显示two-way光标。
autoResizingMode
也可以触发"problems",让调整宽度更难。当设置为OFF
时,当你拖动列边缘时,它可能会移动,但不能自由移动。请务必将autoResizingMode
设置为JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS
或JTable.AUTO_RESIZE_NEXT_COLUMN
以查看可观的变化。(半年后回过头来看还是觉得有用。。。) 如果禁用包含 table 的
JScrollPane
,光标也不会改变,并且不会显示 two-way 光标。