J表。删除行。消耗事件以不再进一步分派

2023-12-04

我需要按删除键从 JTable 中删除行。所以用例非常简单,用户选择一些行,按删除键,行就会被删除。代码也很简单:

DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
    int[] selectedRows = table.getSelectedRows();
    for (int i = selectedRows.length - 1; i > -1; i--) {
        tableModel.removeRow(selectedRows[i]);
    }

问题是,删除完成后,我们会听到一声嘟嘟声(我在 Windows 上,是典型的 Windows 嘟嘟声),就像在空文本框中按删除键时(或者插入符号位于文本末尾时一样)。文本)。 我正在发生的事情是,按键被进一步分派到显示单元格文本内容的文本组件(删除的单元格之后的第一个单元格)。由于点前面没有字符,DefaultEditorKit$DeleteNextCharAction#actionPerformed 方法会发出蜂鸣声。 作为黑客,我修改了侦听​​器中的事件:

e.setKeyCode(KeyEvent.VK_SHIFT) // see JTable#processKeyBinding

该事件不会进一步转发,蜂鸣声是否消失,但我认为这是一个糟糕的解决方案,并且有一个更好的解决方案。但哪个是更​​好的解决方案呢?


  • 您删除行的核心是错误的,必须从最大索引开始,否则删除未选定的行,

代码示例

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.*;

public class RemoveAddRows extends JFrame {

    private static final long serialVersionUID = 1L;
    private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
    private Object[][] data = {
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)},
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)},
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)}
    };
    private JTable table;
    private DefaultTableModel model;

    public RemoveAddRows() {
        model = new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
        JButton button1 = new JButton("Remove all rows");
        button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                int[] selectedRows = table.getSelectedRows();
                for (int i = selectedRows.length - 1; i > -1; i--) {
                    model.removeRow(selectedRows[i]);
                }
                /*if (model.getRowCount() > 0) {
                for (int i = model.getRowCount() - 1; i > -1; i--) {
                model.removeRow(i);
                }
                }*/
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JButton button2 = new JButton("Add new rows");
        button2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
                model.addRow(data0);
                Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
                model.addRow(data1);
                Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
                model.addRow(data2);
                Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
                model.addRow(data3);
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JPanel southPanel = new JPanel();
        southPanel.add(button1);
        southPanel.add(button2);
        add(southPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        RemoveAddRows frame = new RemoveAddRows();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
  • 我是 Win 用户,从未听到 Win 平台发出蜂鸣声,必须发布一个SSCCE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

J表。删除行。消耗事件以不再进一步分派 的相关文章

随机推荐

  • timedelta64 和日期时间转换

    我的数据框中有两个日期时间 时间戳 格式的列 df start df end 我想知道两个日期之间的持续时间 所以我创建了持续时间列 df duration df start df end 然而 现在duration列的格式为numpy t
  • Xcode 首选项 -> 帐户未保存

    一般在Xcode我们可以在偏好设置中保存不同的苹果帐户 它之前在之前的所有版本中都可以工作 上周我更新了Xcode并安装了Xcode version 10 0然后我添加了 3 4 个 Apple ID Xcode gt 首选项 gt 帐户
  • Swift:多个目标处理:宏不起作用[重复]

    这个问题在这里已经有答案了 从参考如何使用 swift 语言处理 XCode 中的多个目标 and https www appcoda com using xcode targets 我创建了三个目标 每个目标都有不同的包 ID 和应用程序
  • 如何将 Google Mock 与 CppUnitTestFramework 结合使用

    TL DR 您可以使用 GMock 向 Microsoft 本机 C 单元测试添加模拟功能 看我的答案请参阅下文了解详细信息 我想开始向我现有的一组本机单元测试添加模拟 这些测试是使用 Microsoft 编写的CppUnitTestFra
  • PHP pthread 中的对象变量丢失上下文

    我在 PHP 中使用 pthreads 并注意到 pthreads 在其上下文中丢失了对象变量 这是正常的还是错误 或者我做错了什么 class Downloader extends Thread private ch public fun
  • 嵌套函数或方法调用会降低应用程序的性能

    我正在使用 asp net 和 C 开发应用程序 其中我们的项目架构有很多嵌套函数调用 public Employe GetEmployeOrder orderid employe GetEmployeOrderWithDetails or
  • 在 Freemarker 模板中显示 Spring MVC 验证错误

    如果控制器返回绑定错误 我试图在我的 freemarker 模板中显示全局验证错误列表 我可以显示与字段关联的错误 但我想检测特定 bean 中何时发生错误并在页面顶部显示一条消息 我尝试使用下面的示例 但它不产生任何输出 lt sprin
  • Windows 和 Linux 之间的 C++ 可移植性

    我有一个关于编写可在 Windows 和 Linux 之间移植的程序的问题 最近我意识到 如果你编写一个使用任何类型的外部库的程序 如果该库没有 Linux 版本 或者在 Linux 中开发时没有 Windows 版本 那么你就完蛋了 那么
  • 如何使用 .htaccess url 重写添加 .php 扩展名?

    我已经在我的网站上设置了 htaccess 文件 该文件将 SLUG 文本显示为 URL 中的页面名称 但不带扩展名 例如真实网址是 www mywebsite com page php page about us 然后通过url重写加载到
  • 尝试使用 pygame.display.update 在 pygame 中显示 png 文件,它显示不到一秒然后消失。

    图像是一张扑克牌 我们使用的是 pygame 4 5 社区版和 pycharm 2 6 9 因为 2 7 不支持 pygame 这是学校 这是代码 import pygame pygame init picture pygame image
  • Pandas:如何通过以下方式连接数据帧?

    我想将多个数据帧连接成一个数据帧 我希望发生串联的方式如以下示例所示 Input tables A B C D 0 x p 2 4 1 y q 3 5 A B E F 0 x p 6 8 1 y q 9 10 Output table A
  • 如何将文本对象添加到现有的pdf中

    我有一个源 pdf 我正在通过添加文本对象来修改它 我正在使用 PDF 规范中提到的 增量更新 但是 在使用此方法添加文本对象时 我犯了一些错误 导致 pdf 在 Adob e Reader 11 中无法正确呈现 当打开 pdf 并双击它时
  • 将扫描仪类与 GUI 一起使用

    我使用 java swing 创建 GUI 并使用扫描仪类获取从 JTextFields 输入到服务器的信息 这可能吗 如果可能的话怎么办 不 没有控制台 因此不要使用 Scanner 相反 您可以使用 TextField 的 getTex
  • 如何使用 BeginInvoke 从 BackgroundWorker 更新 RichTextBox

    我有一个小应用程序 它读取管道分隔文件并将行写入 RTB 突出显示某些 列 中是否存在不允许的字符 这工作得很好 但是 用户想要一个进度条 并看到 实时 写入的行 并且能够中途取消 我有以下扩展方法 我一直用它来写入 RichTextBox
  • Neo4jClient Cypher 查询的排序顺序不正确

    我有以下 Neo4jClient 代码 var queryItem graphClient Cypher Start new n Node ByIndexLookup myindex Name sku Match p n r Relatio
  • 当 SSRS 中的数据不存在时填充“0”

    我正在尝试在 SSRS 中创建一个报告 其中有一个矩阵 其中性别作为列标题 专门定义的年龄组作为行 该报告按日期排序 即 显示的记录按 modifedAt 值过滤 我的问题是 我希望显示所有年龄组类别 即使数据集不返回该行的任何数据 因此
  • 有没有一个网站可以让我查看不同浏览器支持哪些 HTML 5 标签?还有WebGL?

    我想制作一个 HTML Javascript 网络应用程序 有没有一个网站可以比较哪些浏览器已经支持 HTML5 标签 还有WebGL 是的 有很多 以下是每个人的几个 HTML http a deveria com caniuse HTM
  • 如何查询到Firestore子文档

    我正在开发一个应用程序 我想查询 Firestore 子文档 让我进一步解释一下 我有一组存储汽车的文档 每个文档都有一辆带有描述的特定汽车 在上面的每个文档中 我都有一个名为的子集合user data它有自己的文档 其中存储了将汽车添加到
  • C#.NET 线程问题

    我面临 C NET 应用程序中线程之间通信的问题 希望有人能指导我找到可能的解决方案的正确方向 我有一个 C NET 中的应用程序 它是一个 Windows 窗体应用程序 我的应用程序有两个线程 一个线程是主线程 UI 线程 另一个线程是子
  • J表。删除行。消耗事件以不再进一步分派

    我需要按删除键从 JTable 中删除行 所以用例非常简单 用户选择一些行 按删除键 行就会被删除 代码也很简单 DefaultTableModel tableModel DefaultTableModel table getModel i