使用 JComboBox(类别) 更改/更新 JTable 内容

2023-12-11

我的 JTable 有问题。我的 JTable 显示数据库的内容。一个数据库表具有名称类别。每个类别都显示在 JComboBox 中。如果我单击一个类别,它应该更新表格内容。

这是我为您编写的一小段代码,因此可以更轻松地帮助我。代码应该可以运行:

(测试类 - 主要)

package test;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TestClass implements ActionListener{

    String[] header = {"head", "head", "head"};
    Object[][] data = {{Boolean.FALSE, "text", "text"}, {Boolean.FALSE, "text", "text"}, {Boolean.FALSE, "text", "text"}};

    LinkedList<String> newdata = new LinkedList<String>();

    String[] combolist = {"apple", "banana", "cranberry"};

    JComboBox<String> combobox = new JComboBox<String>(combolist);
    JTable table = new JTable(new TestTableModel(data, header));
    JFrame frame = new JFrame();
    JPanel panel = new JPanel(new GridLayout(1, 0, 1, 0));

    public TestClass() {
        combobox.addActionListener(this);
        panel.add(combobox);

        frame.add(panel, BorderLayout.NORTH);
        frame.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        frame.pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == this.combobox) {
            JComboBox<String> combobox = this.combobox;

            newdata.add("Test1");
            newdata.add("Test2");

            TestTableModel model = (TestTableModel) table.getModel();

            int i = 0;
            for (String text : newdata) {
                data[i][0] = Boolean.TRUE;
                data[i][1] = text;
                data[i][2] = text;
                i++;
            }

            model.setData(data);
        }
    }

    public static void main(String[] args) {
        new TestClass();
    }
}

(TestTableModel - AbstractTableModel 如果需要的话(您需要它来执行代码!))

package test;

import javax.swing.table.AbstractTableModel;

public class TestTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 5044877015250409328L;

    private String[] header;
    private Object[][] data;

    public TestTableModel(Object[][] data, String[] header) {
        this.header = header;
        this.data = data;
    }

    public void setData(Object[][] data) {
        this.data = data;
        fireTableDataChanged();
    }

    @Override
    public Class<?> getColumnClass(int column) {
        if (column == 0) {
            return Boolean.class;
        }
        return super.getColumnClass(column);
    }

    @Override
    public int getColumnCount() {
        return header.length;
    }

    @Override
    public String getColumnName(int column) {
        return header[column];
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return column == 0;
    }

    @Override
    public void setValueAt(Object value, int row, int column) {
        data[row][column] = value;
    }

}

使用这个简短的代码,如果您更改类别,表格就会冻结。在我的整个代码中,它也冻结了,但是当我调整窗口大小时(表格调整到与框架相同的大小),我能够在后台看到更新的表格。我不知道为什么它没有被剪掉。

编辑: 更改内容的问题已经解决。来源已更新。但获得正确的表大小的问题尚未解决。在源代码中,我首先使用 3 行数组,然后使用 2 行数组。我想删除旧表并创建一个新表,因此行大小是正确的。

基本上我只想用新内容更新表格。

  • 谢谢你的帮助!

该代码有错误,因为每次actionPerformed()被调用时,您正在创建一个新组件:

table = new JTable(new TestTableModel(data, header));
frame.add(new JScrollPane( table ));  // <-- BTW: here you need to put the table otherwise you are adding an empty JScrollPane
frame.validate();

(注意:还有一个额外的错误,@mKorbel 提到过)。

但是您已经添加了JScrollPane with a JTable到框架,那些仍然存在。 (如果您尝试调整窗口大小,您将在旧表格下方看到新表格)。

更新表数据的正确方法是获取其TableModel进行任何必要的修改在模型中然后根据您所做的更改,您将触发适当的fireXXX()方法通知表重绘自身。

作为一个粗略的例子,您的代码将是:

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == this.combobox) {
        JComboBox<String> combobox = this.combobox;

        newdata.clear();    // Clear your list or create a new one otherwise data will keep piling up.  
        newdata.add("Test1");
        newdata.add("Test2");

        TestTableModel model = (TestTableModel) table.getModel();

        // Since you need to replace the whole data create a new Object[][] each time
        Object[][] newModelData = new Object[newdata.size()][3];

        // Set whatever data to the new array
        int i = 0;
        for (String text : newdata) {
            newModelData[i][0] = Boolean.TRUE;
            newModelData[i][1] = text;
            newModelData[i][2] = text;
            i++;
        }

        // replace all data of the current model
        model.setData(newModelData);
    }
}
....

// Now inside your table model:
    ...
    @Override
    public Class<?> getColumnClass(int column) {
    // if (column == 0) {   
    //     return Boolean.class;             // <-- this produces a ClassCastException with the data you aretrying to set
    // }
       return super.getColumnClass(column);
    }

    public void setData(Object[][] data) {
        this.data = data;       //  <-- Update the data
        fireTableDataChanged(); //  <-- fire the event so the table is notified. If you change only one cell you need to call the appropriate fire event
    }
    ...

更新1:您的新代码问题已经修复了更新模型中数据的方式。但是,当您更新时存在逻辑缺陷data结构。该变量以 3 行数组开始。在里面actionPerformed()方法执行循环的长度为newdata列表只有 2 个条目。因此,您只更新模型的前 2 行。

更新2:看来你没有抓住重点。如何更新模型在这里很重要。该表将显示您的模型拥有的任何数据。如果您只更新 2 行,但保留第 3 行未修改,则表将显示 3 行(2 个新行和 1 个旧行)。由于您每次都需要更改所有数据,因此您需要完全替换模型中的数据。每次需要重新创建的是您的数据而不是表。请参阅更新代码示例。我已经添加了actionPerformed()使用当前源代码重新初始化数据的方法。请阅读内嵌评论。

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

使用 JComboBox(类别) 更改/更新 JTable 内容 的相关文章

  • 在 portlet 中设置 SearchContainer 以使用 EL 和 JSTL 在 JSP 中使用它

    我正在尝试使用SearchContainer在我的liferay应用程序中 目前我必须使用 JSP Scriplets 来设置results in
  • 使用 JavaScript 与 Web 服务器通信的 Applet 是否可以迁移到 JWS?

    只是分享一些信息 希望对社区有用 由于各种浏览器停止支持插件 Applet 的可用性已经下降 Google 已决定停止对 NPAPI 插件的支持 EDGE 不支持插件 Firefox 也不鼓励使用插件 Mozilla 可能会跟进该套件 我们
  • Grails 项目 - Servlet 调用 - ClassNotFoundException:javax.servlet.AsyncContext

    我在用 IntelliJ IDEA 终极版 12 4 grails 2 2 0 BuildConfig groovy 文件中的 grails servlet version 2 5 并实现了简单的 servlet post 请求 使用 RE
  • NIO 直接缓冲区何时以及如何被释放?

    我有一个 C 库 需要一个临时缓冲区作为暂存空间 我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前 是否允许虚拟机重新定位缓冲区 JNI 框架消失后 本机库将保留该指针 我的理解是 JNI 本地对象引用无法缓存 因为 VM 可
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • 我可以使用 Selenium Webdriver 测试元素的顺序吗?

    有一个表单 其中有 3 个字段 具有 3 个不同的 ID fieldset div div fieldset
  • 如何在 QueryDSL 中选择文字

    我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
  • java.lang.ClassNotFoundException: org.jboss.logging.Logger

    我有一个奇怪的问题 我有一个JMS https en wiktionary org wiki JMS客户端应用程序和MDB https en wikipedia org wiki Enterprise JavaBeans Message d
  • Java ArrayList 和 HashMap 动态

    有人可以提供一个创建Java的例子吗ArrayList and HashMap在飞行中 所以而不是做一个add or put 实际上在类实例化时为数组 哈希提供种子数据 举个例子 类似于 PHP 的例子 array array 3 1 2
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • 用于 Eclipse 的 Resharper [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • “强制更新快照/版本” - 这是什么意思

    在 Maven 项目中 选择 更新项目 时 有一个名为 强制更新快照 版本 的选项 它有什么作用 强制更新快照 版本 就像运行以下命令 mvn U install U 也可以用作 update snapshot 看here http boo
  • 短 2 个字节

    我正在从串行端口读取一个长度为 133 字节的数据包 最后 2 个字节包含 CRC 值 我使用 Java 将 2 个字节值制成单个 我认为很短 这就是我所做的 short high 48 0x00ff short low 80 short
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • Eclipse 如何创建一个未解决编译问题的类?

    当我尝试使用 javac 编译此类时 出现编译错误并且未创建 Test class public class Test public static void main String args int x 1L lt this cannot
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询

随机推荐

  • AngularJs Protractor:滑出菜单中的元素不可见

    我带着更多量角器问答回来了 因此 我在尝试查找滑出菜单内的元素时遇到了一个问题 html 片段 div class ng scope div
  • 根据键具有不同名称的值对字典列表进行排序

    我有一个字典列表 如下所示 my list 1200 10 A 1000 24 C 9564 6 D 列表中的所有字典都有一个键值对 我想根据每个字典值的第一个元素 列表 对其进行排序 因此排序后的列表如下所示 my list sorted
  • PostgreSQL 中的 DATE ADD 函数

    目前 我在 Microsoft SQL Server 中有以下代码来获取连续两天查看的用户 WITH uservideoviewvideo date user id AS SELECT DISTINCT date user id FROM
  • 嵌套大括号和指定的初始化器

    为什么我需要嵌套大括号来编译此代码 include
  • 实现 AbstractMultiTenantConnectionProvider

    我正在尝试使用休眠多租户 来自第16章 现在我的扩展存储管理器使用此方法启动多租户会话 public Session getClabSession int serverId String customerSchema if clabFact
  • 在 iOS 5 中为基于页面的应用程序加载背景图像的正确方法?

    我正在开发适用于 iOS 5 的 iBooks 类型的应用程序 除了背景图像之外 一切都正常 特别是在横向模式下 到目前为止我一直在使用 UIImageView background UIImageView alloc initWithIm
  • HTML JQUERY 实现 UL/LI 上的向下箭头

    这是一个简单的要求 我无法使其工作 我只是想使用箭头键进行导航 此外 我想检测何时在 LI 上按下箭头键 但是我无法使用箭头进行导航 我的 keydown 事件也不会触发
  • $_GET URL重写

    嘿大家 希望我能正确解释这一点 我有一些 URL 我想通过 URL 重写来整理它们 例如 我有 domain com index php page 1 domain com index php page 2 domain com index
  • 是否允许将应用程序侧面加载到 Windows RT 设备上?

    是否可以将 Windows 8 应用程序 WinRT 旁加载到 Windows RT 设备 例如新的 Microsoft Surface RT 上 例如 如果我有一个内部业务线应用程序 我可以向我的主管人员提供 Microsoft Surf
  • UCS2/HexEncoded 字符

    任何人都可以帮助我吗 我怎样才能获得 UCS2 HexEncoded 字符 像 Hello 将返回 00480065006C006C006F 这是十六进制编码值 第0048章 第0065章 006C l 006C l 006F o 同样在阿
  • 如何使用离散和连续特征混合中的互信息来选择KBest?

    我正在使用 scikit learn 来训练分类模型 我的训练数据中既有离散特征又有连续特征 我想使用最大互信息进行特征选择 如果我有向量x和标签y前三个特征值是离散的 我可以得到 MMI 值 如下所示 mutual info classi
  • 在EntityFramework中使用SqlQuery来组成真正的IQueryable

    有没有办法让 SqlQuery 或任何其他 sql 执行方法组成模型对象并允许 Include 等方法工作 我正在这样做 其中 view products 是一个 SQL 表函数 var p context SqlQuery
  • 指向作为静态成员的成员变量的指针

    这些天我正在摆弄一个数据模型的项目研究 该模型具有适合我的需求的反射 当我使用最新稳定版本的 g 进行第一项研究时 我在 Visual Studio 19 中失败了 太糟糕了 因为后者是我的主要平台 实际上 我尝试将指向成员变量的指针存储到
  • 图像的可点击区域 - 即使屏幕改变尺寸 html

    我正在尝试学习如何用 HTML 制作一个简单的网站 目前我已经创建了一个背景图像 该图像上有多个形状 我希望图像的不同部分成为可点击的链接 我了解如何查找坐标并使用图像映射 但是当我更改屏幕尺寸时 可单击的链接不起作用 如何使可点击区域适用
  • 从维基百科的某个部分中抓取表格

    我正在尝试想出一种可靠的方法来获取每个赛季 NFL 球队的最终排名 奇妙的是 有维基百科页面包含所有这些信息的链接 不幸的是 最终排名表的存储方式 位置存在很多不一致之处 考虑到联赛结构的演变 这也许是预料之中的 拯救恩典should相关表
  • `:_*`(冒号下划线星号)在 Scala 中做什么?

    我有以下一段代码这个问题 def addChild n Node newChild Node n match case Elem prefix label attribs scope child gt Elem prefix label a
  • Java swing gui 和 lwjgl

    一个简单的问题 是否可以在同一窗口中查看 java Swing 库的 gui 和 lwjgl 3D 场景 而无需使用任何其他 gui 库 如何 您可以使用 Display setParent java awt Canvas 方法将 LWJG
  • TOwnedCollection 和使用多个继承的 TCollectionItem

    我在添加自己的内容时遇到问题TCollectionItem类 继承自TCollectionItem 在同一个范围内TOwnedCollection 我提到了印地IdMessageParts pas for TIdMessagePart按照建
  • Cordova 6.0.0 更新后不断丢失存储空间

    我已经使用 Cordova cli 几年了 今天我从 Cordova 5 4 0 更新到 6 0 0 npm install g cordova latest 然后我将android平台从以前的版本更新到5 1 0 cordova plat
  • 使用 JComboBox(类别) 更改/更新 JTable 内容

    我的 JTable 有问题 我的 JTable 显示数据库的内容 一个数据库表具有名称类别 每个类别都显示在 JComboBox 中 如果我单击一个类别 它应该更新表格内容 这是我为您编写的一小段代码 因此可以更轻松地帮助我 代码应该可以运