【问题标题】:How do I create a Java Swing JTable with header as first column, not as first row?如何创建标题为第一列而不是第一行的 Java Swing JTable?
【发布时间】:2011-03-18 14:06:22
【问题描述】:

我正在使用 Java 6.0 + Swing + JTable。

通常,JTable 将标题呈现为第一行。 (左图)

但是,我想将标题呈现为第一列。 (右图)

我认为这不是 JTable 中的一个简单标志。

您能否推荐一种方法或现有的小部件库?

我假设我需要重写 JTableHeader 和 JTable 的 paint() 方法。

谢谢

【问题讨论】:

    标签: java swing header jtable transpose


    【解决方案1】:

    哎呀,没关系你想要一个转置的 TableModel,而不仅仅是行标题。

    http://tips4java.wordpress.com/2008/11/18/row-number-table/

    【讨论】:

      【解决方案2】:

      您可以使用 TableModel 来做到这一点,您应该在 getColumnClass 中返回一个特定的 Class,使用 Renderer 将其绘制为 Header Column。并且可能,您将使您的 getValueAt 垂直。

      这并不简单,但却是可能的。

      当我发布它时,您发布的图像不可见,对于您的情况,您应该使用 CellRenderer 使其像 Header,但它仍然在 TableModel 上。

      【讨论】:

        【解决方案3】:

        这个怎么样,你基本上覆盖了 getValueAt(int row, int column)。这是一个测试类:

        package so.pivot;
        
        import javax.swing.JFrame;
        import javax.swing.JTable;
        
        public class Test extends JFrame{
            public static void main(String[] args){
                Test test = new Test();
                String[] columnNames = {"First Name",
                        "Last Name",
                        "Sport",
                        "# of Years",
                        "Vegetarian"};
                Object[][] data = {
                        {"Kathy", "Smith",
                         "Snowboarding", new Integer(5), new Boolean(false)},
                        {"John", "Doe",
                         "Rowing", new Integer(3), new Boolean(true)},
                        {"Sue", "Black",
                         "Knitting", new Integer(2), new Boolean(false)},
                        {"Jane", "White",
                         "Speed reading", new Integer(20), new Boolean(true)},
                        {"Joe", "Brown",
                         "Pool", new Integer(10), new Boolean(false)}
                    };
        
                JTable table = new JTable(data, columnNames){
                    @Override
                    public Object getValueAt(int row, int column){
                        return super.getValueAt(column, row);
                    }
                };
        
                test.add(table);
                test.pack();
                test.setVisible(true);
            }
        
        }
        

        【讨论】:

          【解决方案4】:

          我也有同样的问题。这是我的实现。我有一个固定的标头数组,还有一个用于其余数据的二维数组,这些数据是通过 json 填充的,尽管不相关也不在这里显示。请注意,这支持列级别的动态填充:

          import javax.swing.JFrame;
          import javax.swing.JScrollPane;
          import javax.swing.JTable;
          import javax.swing.table.DefaultTableModel;
          
          public class Test {
            public static void main(String[] argv) throws Exception {
              DefaultTableModel model = new DefaultTableModel();
              JTable table = new JTable(model);
              model.addColumn("Header");
          
              String[] headers = { //If you wish to separate the headers array from columns array
                  "Header 1",
                  "Header 2",
                  "Header 3"
              };
              String [][]columnData = new String[][]{
                  {
                      "Column 1.1",
                      "Column 1.2",
                      "Column 1.3"
                  },{
                      "Column 2.1",
                      "Column 2.2",
                      "Column 2.3"
                  },{
                      "Column 3.1",
                      "Column 3.2",
                      "Column 3.3"
                  }
              };
          
              for(int col=1;col<(columnData.length+1);col++){
                  model.addColumn("Col"+col);
              }
              for(int i=0;i<headers.length;i++){
                  model.addRow(new Object[] { headers[i] });
              }
              for(int r=0;r<columnData.length;r++){
                  for(int c=0;c<columnData[0].length;c++){
                      model.setValueAt(columnData[r][c],c,r+1);
                  }
              }        
              JFrame f = new JFrame();
              f.setSize(500, 300);
              f.add(new JScrollPane(table));
              f.setVisible(true);
            }
          }
          

          这是输出:

          【讨论】:

            猜你喜欢
            • 2015-04-05
            • 1970-01-01
            • 1970-01-01
            • 2014-04-01
            • 2013-11-03
            • 2020-04-20
            • 2021-12-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多