使用可编辑的列数和行数为JTable设置列名

时间:2015-12-07 07:12:01

标签: java swing jtable jtableheader

我的窗口基本上是什么样的

enter image description here

我一直试图编写一种方法来制作动态jtable,其中列标题是Y,Xsub1,Xsub2,Xsub3,...,Xsub30。表的列数和行数由特定的文本字段确定,要求每个文本字段的所需数量,其中我将代码限制为仅30列。 我能够使用长代码在Xsub30的范围内完成它,但它说编码中存在错误。它只能在没有出现错误的情况下上升到Xsub10,即使Xsub1到Xsub30的代码是相似的。我通过网络搜索以寻找一种方法来使用"对于"或者"如果",那么它会更短,但到目前为止我的代码仍有错误。 顺便说一下,变量都是初始化的。我正在使用Netbeans IDE 8.0.2。 请帮我解决这个问题。

    rows = Integer.parseInt(rowsField.getText() ) ;
    col = Integer.parseInt(colField.getText() ) ;
    Object[][] rowArray = new Object[rows][col] ;


    valuesTable = new javax.swing.JTable();
    valuesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF );


    if (col <1)
    {
        JOptionPane.showMessageDialog(this, "Sorry, that input is invalid");
    }

    if (col >30)
    {
        JOptionPane.showMessageDialog(this, "Sorry, that input is out of bounds");
    }

    if (rows <1)
    {
        JOptionPane.showMessageDialog(this, "Sorry, that input is invalid");
    }


    for (int x = 0; x < columnNames.length; x++)
    {valuesTable.getColumn(x).setHeaderValue(columnNames[x]);}


    if (col>=1 && col<=30)
    {
        valuesTable.setModel(new javax.swing.table.DefaultTableModel(
            rowArray, columnNames
        )



        {
         Class[] types = new Class[]{
                java.lang.Double.class, java.lang.Double.class
            };

            public Class getColumnClass(int columnIndex) {
                return types[columnIndex];
            }
        });

        jScrollPane1.setViewportView(valuesTable);

    }

1 个答案:

答案 0 :(得分:3)

正如@mKorbel所说,你需要使用TableColumnModel

valuesTable.getColumnModel().getColumn(0).setHeaderValue("Y");
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class DynamicColumnTest {
  private final JTable valuesTable = new JTable();
  public JComponent makeUI() {
    valuesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(valuesTable));
    p.add(new JButton(new AbstractAction("Apply col+1") {
      private int col = 1;
      @Override public void actionPerformed(ActionEvent e) {
        int rows = 5; //Integer.parseInt(rowsField.getText());
        col = 1 + col % 30; //Integer.parseInt(colField.getText());
        Object[][] rowArray = new Object[rows][col];
        Object[] columnNames = Collections.nCopies(col, "Xsub").toArray();
        valuesTable.setModel(new DefaultTableModel(rowArray, columnNames));

        valuesTable.getColumnModel().getColumn(0).setHeaderValue("Y");
        for (int x = 1; x < columnNames.length; x++) {
          //XXX: IllegalArgumentException: Identifier not found
          //XXX: valuesTable.getColumn(x).setHeaderValue(columnNames[x]);
          String s = String.format("%s%d", columnNames[x], x);
          valuesTable.getColumnModel().getColumn(x).setHeaderValue(s);
        }
      }
    }), BorderLayout.NORTH);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new DynamicColumnTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}