2016-07-22 67 views
0

尽管我已将setResizingAllowed()设置为true,但我无法通过在标题列之间移动光标并拖动分隔线来调整列宽。JTable Swing:我无法通过在标题中拖动光标来调整列的大小

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); 

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

+3

*“任何想法?”*为了更好地提供帮助,请张贴[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –

+0

阅读链接后编辑问题。如果之后有任何想法......谢谢。 – FaithReaper

+2

你显然不明白链接,因为不可编译的代码片段可能是M,但不是C,V或E的问题。请注意,如果真正需要制作完整,可编译和可运行的示例,则适当的MCVE可能为150 LOC。一个好的MCVE测试如下。将'MCVE'粘贴到IDE中的新项目中。编译干净,运行它看问题。 –

回答

1
  1. 确保你的头是一个你将要配置。

所以,用:

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

我只是创建另一头与我的表的同一model,做配置那里,却没有意识到我创建的新报头是不是我的表的。我必须致电table.getTableHeader()以获取我想要的标题并且配置可以正常工作。对不起,愚蠢。

  1. 确保在将鼠标悬停在此表格中的列之间的边缘上时,将光标设置为默认光标,以便您可以看到它成为双向箭头,并且您意识到他们是可调整的。

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

如果你将其设置为CURSOR_HAND,没有双向光标将不会显示。

  • autoResizingMode也可以触发 “问题”,使其更难调整宽度。当它被设置为OFF时,拖动列边时,它可能会移动,但不是自由的。请务必将autoResizingMode设置为JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNSJTable.AUTO_RESIZE_NEXT_COLUMN以查看可观的更改。

  • (半年后,当我回到我的回答,我还是觉得有用...) 如果禁用JScrollPane包含表时,光标不会改变都不是,而不是双向光标将被显示。

  • 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); 
        } 
    } 
    
    +0

    谢谢你的回答,但是我发现了其他的东西。将它放在下面。 – FaithReaper

    相关问题