java - 为具有可编辑列数和行数的 JTable 设置列名称

标签 java swing jtable jtableheader

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

enter image description here

我一直在尝试编写一种方法来制作动态 jtable,其中列标题为 Y、Xsub1、Xsub2、Xsub3、...、Xsub30。表的列数和行数由特定的文本字段确定,要求每个文本字段提供所需的数量,我在其中编写了代码将其限制为仅 30 列。 我能够使用长代码达到 Xsub30 的程度,但它说编码中有错误。它只能上升到Xsub10而不会出现错误,尽管Xsub1到Xsub30的代码是相似的。我在网上搜索寻找一种使用“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);
  }
}

关于java - 为具有可编辑列数和行数的 JTable 设置列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34128218/

相关文章:

java - 如何修复此异常不匹配错误?

java - 从系统属性获取 JRE 版本

java - Circleci 图像中的后缀 "-stretch"意味着什么?

java - SwingWorker doInBackground 执行时的用户输入

java - 从文本文件读取数据时在 JTable 中显示数据

java - 我的模式有什么问题吗?

java - 如何在运行时使JTable列交换后JLabel仍然出现?

java - JPanel 上的 MouseEvent - 坐标错误

java - JTable,如何设置不同的侧边框

java - 自定义 TableModel 中的 NullPointerException