我的窗户基本上是什么样子

java - 设置JTable的列名,其中列和行的数量可编辑-LMLPHP

我一直在尝试编写一种方法来制作动态jtable,其中列标题为Y,Xsub1,Xsub2,Xsub3,...,Xsub30。该表的列数和行数由特定的文本字段确定,每个文本字段要求提供所需的数字,在此我编写了将代码限制为仅30列的代码。
我可以使用长代码做到Xsub30的程度,但是它表示编码中有错误。即使Xsub1到Xsub30的代码相似,它也只能上升到Xsub10,而不会出现错误。我在网上搜索了一种使用“ for”或“ if”对其进行编码的方法,以便短一些,但到目前为止我的代码仍然有错误。
顺便说一下,所有变量都已初始化。我正在使用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);

    }

最佳答案

正如@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);
  }
}

10-05 19:13