如何操作指定列上的 JTable 返回值?

2024-05-11

我有一个 JTable 有两列(可编辑的JTable)。当用户在第二列中输入内容时,我的要求如下:

  • 用户只能输入数字和逗号

  • 当用户输入错误字符时,会发出蜂鸣声(Toolkit.getDefaultToolkit().beep();)

我该如何实现这一目标? (如果是jtextfield,则需要文档过滤器或纯文档等,如果是JTable,那么如何?)


实施一个TableCellEditor http://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableCellEditor.html能够返回文本组件(JTextField)有一个DocumentFilter http://docs.oracle.com/javase/7/docs/api/javax/swing/text/DocumentFilter.html附加到它能够根据您的需要过滤传入的文本。

您可能想看一下

  • 使用文档侦听器限制文本字段中的字符 https://stackoverflow.com/questions/12812844/limit-the-characters-in-the-text-field-using-document-listner/12812935#12812935
  • MDP 的博客 http://www.jroller.com/dpmihai/entry/documentfilter
  • java中只接受单个数字 https://stackoverflow.com/questions/13224455/accept-only-a-single-digit-in-java/13224591#13224591
  • 文本组件功能 http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html(查找“实现文档过滤器”)

已更新示例

如果它是jtextfield,它需要文档过滤器或纯文档等,如果它 JTable,那又如何呢?

阅读教程,针对您遇到的问题提出问题。重要的是,您要了解为什么事情以某种方式完成,而不是简单地复制和粘贴其他代码,否则您将不知道何时复制了不好的想法;)

public class TestFilteredCellEditor {

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

    public TestFilteredCellEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FilteredEditorPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FilteredEditorPane extends JPanel {

        public FilteredEditorPane() {
            setLayout(new BorderLayout());
            JTable table = new JTable(new MyTableModel());
            TableColumnModel columnModel = table.getColumnModel();
            columnModel.getColumn(1).setCellEditor(new FilteredTableEditor());
            add(new JScrollPane(table));
        }
    }

    public class FilteredTableEditor extends AbstractCellEditor implements TableCellEditor {

        private JTextField editor;

        public FilteredTableEditor() {
            editor = new JTextField();
            ((AbstractDocument) editor.getDocument()).setDocumentFilter(new NumericDocumentFilter());
        }

        @Override
        public boolean isCellEditable(EventObject e) {
            return true;
        }

        @Override
        public Object getCellEditorValue() {
            return editor.getText();
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value instanceof String) {
                editor.setText((String) value);
            } else {
                editor.setText(null);
            }
            return editor;
        }
    }

    public class NumericDocumentFilter extends DocumentFilter {

        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                String string, AttributeSet attr)
                throws BadLocationException {

            StringBuilder buffer = new StringBuilder(string);
            boolean isBad = false;
            for (int i = buffer.length() - 1; i >= 0; i--) {
                char ch = buffer.charAt(i);
                if (!Character.isDigit(ch)) {
                    buffer.deleteCharAt(i);
                    isBad = true;
                }
            }
            if (isBad) {
                Toolkit.getDefaultToolkit().beep();
            }
            super.insertString(fb, offset, buffer.toString(), attr);
        }

        public void replace(DocumentFilter.FilterBypass fb,
                int offset, int length, String string, AttributeSet attr) throws BadLocationException {
            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }

    public class MyTableModel extends AbstractTableModel {

        @Override
        public int getRowCount() {
            return 1;
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return "";
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何操作指定列上的 JTable 返回值? 的相关文章

随机推荐

  • 合并git中2个不同分支中具有相同名称的2个文件

    我目前有一个名为test1在一个名为branch1创建自master另一个文件也命名为test1在一个名为branch2也创建自master 如果我合并 master 中的两个分支 这两个文件中编写的代码会发生什么 As 阿米尔回答了 ht
  • Oracle Many OR 与 IN () 的 SQL 性能调优 [重复]

    这个问题在这里已经有答案了 我手头没有 解释计划 您能帮忙判断以下哪一个更有效吗 选项1 select from VIEW ABC where STRING COL AA OR STRING COL BB OR STRING COL BB
  • React useEffect hook 和 Async/await 自己的获取数据函数?

    我尝试创建一个从服务器获取数据的函数 并且它有效 但我不确定这是否正确 我创建了一个函数组件来获取数据 使用useState 使用效果 and 异步 等待 import React useState useEffect from react
  • Spring Security 上的组和 acl

    我想使用 Spring Security 来管理用户 组和权限 我想使用 ACL 来保护我的域对象 但我找不到将组分配给 acl 的方法 例如 我有用户和组 每个组可以拥有以下证券 管理论坛 可以是类似的角色ROLE FORUM MANAG
  • MySQL:用户对数据库的访问被拒绝

    我正在尝试在 Heroku 上的远程 SQL 服务器上创建一个数据库 clearDB 我与此联系 mysql host lt
  • 在scala / play框架中构建Json文件

    我正在使用 Play 框架和 Scala 我需要提供一个如下所示的输入 id node37 name 3 7 data children 如何使用 json 获取该格式 以下是 Play 框架网站上的示例 val JsonObject Js
  • 如何重新包含排除的文件夹

    所以我只是无意中点击了我的项目的致命一击Exclude From Project代替Add在我的控制器文件夹中 当尝试添加名为 Controllers 的文件夹时 我收到错误 此文件夹存在 但是 如果我尝试单击该项目 gt Add Exis
  • CSS - 制作“步进”文本的好方法?

    有没有一种好的方法可以实现以下目标 而无需任何额外的标记 不过使用 JavaScript 就很好了 任何想法 Thanks Edit 我的标记将是这样的 div style width 400px p Text text text Text
  • iText7:如何获取段落的实际宽度

    在添加到文档之前 我需要知道段落的宽度 以磅为单位 我在这里搜索并找到了 Alexey 关于段落高度的答案 所以我用宽度做了它 但它不起作用 无论段落有多长 始终返回矩形的宽度 我尝试了这段代码 private float getRealP
  • 如何在 VS2015 中使用 Intellisense 查看抛出哪些异常?

    这个问题已在 VS2015 Update 1 中得到解决和修复 有没有办法在VS2015中显示异常 VS2015 VS2013 在您实际编写代码之前 它似乎不再显示在智能感知工具提示中 一旦代码出现 将鼠标悬停在其上即可使其完整显示 注意
  • 当我使用nodemon和ts-node时,为什么节点检查器没有启动?

    我有一个用打字稿编写的简单节点服务器 我的 package json 配置为 scripts build tsc dev nodemon watch src e ts json exec ts node src server ts debu
  • 关系数据库和图数据库的比较

    有人可以向我解释一下 MySQL 等关系数据库与 Neo4j 等图形数据库相比的优缺点吗 在 SQL 中 您有多个表 它们之间有不同的 id 链接 然后你必须加入来连接表 从新手的角度来看 为什么要将数据库设计为需要联接 而不是像图形数据库
  • 从命名空间重新导出 Typescript 枚举?

    我在模块 some lib 中有一个枚举定义 我想从模块中的命名空间重新导出它 如下所示 import PaymentType from some lib namespace Payout export enum PaymentType P
  • 如何将 hashbang url 更改为历史 API

    我正在使用 ember1 0 rc3 我想将 hashbang url 更改为正常的 url 格式 即 www site com admin page1 到 www site com admin page1 更改 我在应用程序路由器中使用位
  • 在 Cloudbees Jenkins 文件夹中设置环境变量

    在我重新安装 Jenkins 和 Cloudbees Free Enterprise 插件后 Jenkins 文件夹中设置的环境变量停止工作并从配置 UI 中消失 但是 它仍然存在于文件系统上的 config xml 中 如下所示
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 序列化对于对象大小估计可靠吗?

    我使用序列化来估计对象使用的内存量 我已经读过this https stackoverflow com questions 426396 how much memory does a c net object use and this ht
  • Rails 的 Puma Systemd 配置不起作用

    我已经完成了一个使用 Ruby on Rails 构建的应用程序 现在我想将其托管在 AWS 上的 EC2 实例上 我已经为其配置了服务器 并且正在使用pumaHTTP服务器作为应用服务器 在生产中启动应用程序总是需要我运行RAILS EN
  • 用C++连接oracle数据库

    我正在寻找一种方法来连接到远程 Oracle 数据库并从 C 控制台应用程序中的表中读取一些数据 有人可以给我一些提示吗 谢谢 soci http soci sourceforge net http soci sourceforge net
  • 如何操作指定列上的 JTable 返回值?

    我有一个 JTable 有两列 可编辑的JTable 当用户在第二列中输入内容时 我的要求如下 用户只能输入数字和逗号 当用户输入错误字符时 会发出蜂鸣声 Toolkit getDefaultToolkit beep 我该如何实现这一目标