【问题标题】:How to align all jtable cells and headers at once?如何一次对齐所有 jtable 单元格和标题?
【发布时间】:2013-12-09 03:08:14
【问题描述】:

是否有一种-->高效一次性集中所有内容的方法?

我不介意它是在初始化部分还是在它之后,都欢迎。

到目前为止我的代码:

jTable2 = new javax.swing.JTable();

jTable2.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
    },
    new String [] {
        "header1", "header2", "header3"
    }
)); 

我设法使标题居中,但将所有内容逐个居中是错误的:S

DefaultTableCellRenderer renderer;
renderer = (DefaultTableCellRenderer)
            jTable2.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(JLabel.CENTER);

【问题讨论】:

    标签: java swing alignment performance jtableheader


    【解决方案1】:

    这可能是一个有点旧的帖子,但对于那些和我搜索同样问题的人来说。

    这可以让很多表格同时轻松对齐(我对这件事有点懒惰,所以我一直在寻找并尝试最简单的方法:P)。

        ArrayList<JTable> Tables = new ArrayList(); //JTable or javax.swing.JTable ... as it confused me as a beginner in Java codding
    
        Tables.add(jTable1);
        Tables.add(jTable2);
            //.........
            //.........
    
        DefaultTableCellRenderer centerRenderer_c = new DefaultTableCellRenderer();
        DefaultTableCellRenderer centerRenderer_h = new DefaultTableCellRenderer();
        centerRenderer_c.setHorizontalAlignment( javax.swing.JLabel.CENTER );
    
        for(JTable t : Tables){
            t.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);// this will reverse the headers visually 
    
            //for the headers :
            centerRenderer_h = (DefaultTableCellRenderer)t.getTableHeader().getDefaultRenderer();
            centerRenderer_h.setHorizontalAlignment( javax.swing.JLabel.CENTER );
    
            //for cells :
            for(int i=0; i < t.getColumnCount(); i++){
                t.getColumnModel().getColumn(i).setCellRenderer(centerRenderer_c);
            }
        }
    

    【讨论】:

      【解决方案2】:

      我想你可以从这个问题中得到参考:java - How to center in JTable cell a value? - Stack Overflow
      第二个答案中心所有带有循环的列对我来说总是正常工作。

      附:正如@camickr 提到的,第二个答案可能会导致自定义渲染的丢失。

      根据How to Use Tables,如果我们使用下面的构造函数。

      • JTable(Object[][] rowData, Object[] columnNames)
      • JTable(向量行数据,向量列名)

      然后他们会将所有数据类型视为字符串。在这种情况下,第二个答案会很好。

      但是如果用户在 AbstractTableModel (see here TableDemo.java) 中重写了getColumnClass(int c) 函数,那么第二个答案将导致默认渲染器丢失:默认渲染将在使用第二个答案后将布尔类型打印为复选框,表格将改为打印“true”/“false”。

      因此,如果您想同时使用默认渲染和居中单元格。这个答案会对你有所帮助:
      java - Overriding JTable's DefaultTableCellRenderer to center all the cells in a JTable - Stack Overflow

      【讨论】:

      • 第二个答案不是一个好的解决方案。当然它适用于你只有字符串。但是,如果您在表格中有数字或日期,那么您将失去这些对象的自定义呈现。
      • 我同意@camickr。此外,这似乎是绕过问题,而不是解决方案。
      • 嗨,@camickr 和 user2692669,我已经修改了我的答案,因为我的声誉很低并且无法在其他人的帖子下添加 cmets,所以我发送了一个答案。无论如何,非常感谢您的cmets!现在我也更好地理解了 JTable 的渲染。
      猜你喜欢
      • 2011-01-25
      • 2019-08-11
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2023-04-02
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多