在运行时为 JTable 创建行标题

2024-03-31

我刚刚开始工作JTable。这是我的表示例。添加行按钮将行添加到表中。我想为此表创建行标题。我怎样才能实现这个目标?

有人可以帮我吗?

示例表的代码是:

package test;

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.table.*;

import test.InsertRows.CellEditor;

public class SampleTable extends JFrame {

JTable table;
JPanel panel;
DefaultTableModel dataModel;

public SampleTable () {
    super("My Table Example");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    onInit();
} 

void onInit()
{
    JButton b=new JButton("Add Row");
    b.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e)
        {
            // TODO Auto-generated method stub
            insertNewRow();

        }


    });

    panel = new JPanel(new BorderLayout());

    String[] columnNames = {
            "Name",
            "OID",
            "Index",
            "Value",
    };
    Object[][] data = {
            {"sysLocation","1.3.6.1.2.1.1.6","0",""},
                {"sysContact","1.3.6.1.2.1.1.4","0",""},
                    {"sysDescr","1.3.6.1.2.1.1.1","0",""}

    };

    dataModel = new DefaultTableModel();
    for (int col = 0; col < columnNames.length; col++) {
        dataModel.addColumn(columnNames[col]);
    }
    for (int row = 0; row < 3; row++) {
        dataModel.addRow(data[row]);
    }

    table = new JTable(dataModel);
    table.setDefaultEditor(Object.class, new CellEditor(this, table));
    table.setPreferredScrollableViewportSize(new Dimension(600, 120));
    table.setFillsViewportHeight(true);

    //Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);

    //Add the scroll pane to this panel.
    panel.add(scrollPane,BorderLayout.CENTER);
    panel.add(b,BorderLayout.SOUTH);
    panel.setOpaque(true); //content panes must be opaque
    setContentPane(panel);

    //Display the window.
    pack();
    setVisible(true);
}
public static void main(String[] args) {
    SampleTable myFrame = new SampleTable();
} 
private void insertNewRow()
{

    if(vaidCheck(table)){
        dataModel.insertRow(table.getRowCount(),
                new Object[] {"", "", "", ""}
                );
        dataModel.fireTableRowsInserted(
                dataModel.getRowCount(),
                dataModel.getRowCount()
        );
    }
    else{
        JOptionPane.showMessageDialog(null,"Field is empty");                                                                            
    }

}
public boolean vaidCheck(JTable table)
{
      if(table.getCellEditor()!=null){
          table.getCellEditor().stopCellEditing();
      }
      for(int row=0;row< table.getRowCount();row++){
          for (int col=0;col<table.getColumnCount();col++){
              String om=table.getValueAt(row,col).toString();
              if(om.trim().length()==0){
                  return false;
              }
          }
      }
      return true;
 }

 public class CellEditor extends DefaultCellEditor
  {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private JTable m_Table = null;
        public CellEditor(JFrame parentFrame, JTable table) { 
            super(new JTextField());
            super.setClickCountToStart(1);
            m_Table = table;
        }
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, int column)
        {
            if(column == 0){
                 Object[] objectArray = {"Nikhil","Nijil"};
                    JComboBox comboBox = new JComboBox(objectArray);
                    comboBox.setEditable(true);
                    comboBox.setSelectedItem(value);

                    ItemListener itemListener = new ItemListener() {
                        public void itemStateChanged(ItemEvent e) {
                            if(e.getStateChange() == ItemEvent.SELECTED) {
                                if(null != m_Table.getCellEditor()){ 
                                    m_Table.getCellEditor().stopCellEditing();
                                }

                                m_Table.setValueAt(e.getItem(), row, 0);
                            }
                        }
                    };
                    comboBox.addItemListener(itemListener);
                    return comboBox;
            }
            if(column == 2){

            }
            JTextField textField = (JTextField)super.getTableCellEditorComponent(table, value, isSelected, row, column);
            return textField;

        }
  }
} 

我希望我对这个问题的解释是正确的。要显示行标题,您需要创建一个新的单元格渲染器并将其设置在所需的列上。例如,这是一个模拟表头的基本渲染器:

static class RowHeaderRenderer extends DefaultTableCellRenderer {
    public RowHeaderRenderer() {
        setHorizontalAlignment(JLabel.CENTER);
    }

    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        if (table != null) {
            JTableHeader header = table.getTableHeader();

            if (header != null) {
                setForeground(header.getForeground());
                setBackground(header.getBackground());
                setFont(header.getFont());
            }
        }

        if (isSelected) {
            setFont(getFont().deriveFont(Font.BOLD));
        }

        setValue(value);
        return this;
    }
}

要进行设置,您可以执行以下操作:

table.getColumnModel().getColumn(0).setCellRenderer(new RowHeaderRenderer());

根据发布的代码,它看起来如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时为 JTable 创建行标题 的相关文章

  • Android Toast 消息不起作用

    我正在通过 Andengine 为 Android 开发游戏 我有 MainActivity 类和 GameScene 类 我在 GameActivity 中使用 Toast 消息 它正在发挥作用 Toast makeText this H
  • 简单 XML 框架:ElementMap 中的对象具有“类似内联”的行为

    我正在尝试在 Android 上序列化自定义对象的 Hashmap 以获得如下 xml
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • JERSEY:错误跟踪:java.lang.IllegalStateException:实体输入流已关闭

    我正在使用 Jersey 2 x 以下是我的控制器 GET Path id Produces application json public Response getUser PathParam id int userId Context
  • Time.valueOf 方法返回错误值

    我使用 Time valueOf 方法将字符串 09 00 00 转换为 Time 对象 如下所示 Time valueOf LocalTime parse 09 00 00 当我调用 getTime 来显示我得到的值时 28800000
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐