共享两个组合框的数据源

2024-01-26

我的 GUI 中有多个组合框,它们都需要数据。这些数据会随机变化,因此需要一种快速方法来保持所有值同步。我遇到了 DefaultComboBoxModel,它实际上非常适合。唯一的问题是,我需要组合框彼此独立 - 这意味着:如果我在其中选择一个值,则所有其他组合框不应更改。 我做了一些研究并阅读了标准的 java 教程,但没有人真正告诉我如何使用 DefaultComboBoxModel 来实现这一点。

这里的这个例子准确地说明了我所需要的:在两个 JComboBox 之间共享数据模型 http://www.java2s.com/Tutorial/Java/0240__Swing/SharingtheDataModelbetweentwoJComboBoxes.htm但选择其中之一时,两者的 selectedindex 不应同时更改。

这个问题 https://stackoverflow.com/questions/13455767/shared-data-between-two-comboboxes已经问过类似的问题,但我不知道如何处理“装饰”。

有什么办法可以防止更改,或者例如仅使用普通数组来同步值?

也许有人可以用鱼快速打我的脸,因为解决方案可能非常简单......


我认为这就是罗宾在您的帖子中提到的答案中所解释的。您将原始组合框模型包装成 2 个独立的组合框模型,这些模型依赖于原始组合框模型的数据元素,但实现了自己的选择模型。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class SharedDataBetweenComboBoxSample {

    public static class MyComboBoxModel extends DefaultComboBoxModel implements ComboBoxModel, ListDataListener {
        private DefaultComboBoxModel original;

        public MyComboBoxModel(DefaultComboBoxModel original) {
            super();
            this.original = original;

        }

        @Override
        public int getSize() {
            return original.getSize();
        }

        @Override
        public Object getElementAt(int index) {
            return original.getElementAt(index);
        }

        @Override
        public void addListDataListener(ListDataListener l) {
            if (getListDataListeners().length == 0) {
                original.addListDataListener(this);
            }
            super.addListDataListener(l);
        }

        @Override
        public void removeListDataListener(ListDataListener l) {
            super.removeListDataListener(l);
            if (getListDataListeners().length == 0) {
                original.removeListDataListener(this);
            }
        }

        @Override
        public void addElement(Object anObject) {
            original.addElement(anObject);
        }

        @Override
        public void removeElement(Object anObject) {
            original.removeElement(anObject);
        }

        @Override
        public int getIndexOf(Object anObject) {
            return original.getIndexOf(anObject);
        }

        @Override
        public void insertElementAt(Object anObject, int index) {
            original.insertElementAt(anObject, index);
        }

        @Override
        public void removeAllElements() {
            original.removeAllElements();
        }

        @Override
        public void removeElementAt(int index) {
            original.removeElementAt(index);
        }

        @Override
        public void intervalAdded(ListDataEvent e) {
            fireIntervalAdded(this, e.getIndex0(), e.getIndex1());
        }

        @Override
        public void intervalRemoved(ListDataEvent e) {
            fireIntervalRemoved(this, e.getIndex0(), e.getIndex1());
        }

        @Override
        public void contentsChanged(ListDataEvent e) {
            fireContentsChanged(this, e.getIndex0(), e.getIndex1());
        }

    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final String labels[] = { "A", "B", "C", "D", "E", "F", "G" };

                final DefaultComboBoxModel model = new DefaultComboBoxModel(labels);

                JFrame frame = new JFrame("Shared Data");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel panel = new JPanel();
                JComboBox comboBox1 = new JComboBox(new MyComboBoxModel(model));
                comboBox1.setEditable(true);

                JComboBox comboBox2 = new JComboBox(new MyComboBoxModel(model));
                comboBox2.setEditable(true);
                panel.add(comboBox1);
                panel.add(comboBox2);
                frame.add(panel, BorderLayout.NORTH);

                JButton button = new JButton("Add");
                frame.add(button, BorderLayout.SOUTH);
                ActionListener actionListener = new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent actionEvent) {
                        model.addElement("New Added");
                    }
                };
                button.addActionListener(actionListener);

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

共享两个组合框的数据源 的相关文章

随机推荐

  • Angularjs 使用 django 的 url 进行路由

    我使用 AngularJS 作为前端 使用 Django 作为后端 我在后端做非常简单的事情 所以我没有考虑使用tastypie 我遇到的问题是客户端 服务器路由 我彻底困惑了 我所做的是 从django渲染entry html页面 其中有
  • 在cmd中重新排列数组元素

    我的批处理文件中有一个数组 如下所示 port 0 port 1 0 port 2 3 port 3 2 是否有任何漂亮而优雅的方法可以将值向后移动一个元素 所以它看起来像这样 port 0 0 port 1 3 port 2 2 port
  • Caffe 运行测试失败

    成功构建 caffe 后 我进行了 runtest 但在 ImageDataLayer DBTest DataTransformTest HDF5OutputLayerTest 和一些求解器中失败 构建 链接到特定路径时是否缺少步骤 这是测
  • Django REST Framework 验证错误:“输入有效的 URL。”

    在我的 Django REST Framework 项目中 我有一个模型类 用于保存 Django 应用程序将在后台任务中抓取的服务 class Service models Model name models CharField max
  • URL 特定编码

    我尝试重新创建 URL 但找不到编码函数 Edit 背景 该字符串用于 API 当然没有文档 我尝试使用原始网址编码但似乎只有原始的编码 解码功能有效 所以我必须找到它是什么 input 2 3 word 888 gt word2 AND
  • CGridView 中的格式化日期过滤器

    我在 CGridView 中将日期显示为 22 6 2012 22 53 array name gt date value gt date j n Y G i strtotime model gt date 但在我的过滤器中 我需要以这种格
  • 如何在 SQL 中从另一个表获取计数?

    我有以下关于 SQL 的表 Mensajes IdMensaje int PK NOT NULL IdCliente int CorreoCliente varchar 100 CorreosAdicionales varchar MAX
  • 将滑动触摸从 UIView 传递到底层 UIScrollView 以实现正确滚动

    我的情况与这两篇文章类似 1907297 http www stackoverflow com questions 1907297 AND 689684 http www stackoverflow com questions 689684
  • NineOldAndroids,旋转或移动后不可点击视图

    I use 九老机器人 http nineoldandroids com2 4 0 为对象设置动画 主要用于运动和变换的控制 在 Android 4 0 及更高版本上一切正常 但在以前的版本 2 1 2 3 上 动画元素没有获得焦点并且不可
  • 在 Rails 中调试? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何在 RubyonRails 中 相对 成功地调试 我知道并广泛使用以下内容 Terminal 导轨控制台 开发者工具 日志文件 生产 开发
  • 删除 pandas DataFrame 列中字符串条目的末尾

    我有一个 pandas Dataframe 其中一列是文件列表 import pandas as pd df pd read csv fname csv df head filename A B C fn1 txt 2 4 5 fn2 tx
  • NA 正在箱线图 ggplot2 中绘制

    我正在尝试在 ggplot2 中绘制一个简单的箱线图 我有物种丰富度与土地利用类别 但是 我的数据中有 2 个 NA 出于某种奇怪的原因 它们被策划了 即使它们被 R 理解为 NA 有什么建议删除它们吗 我正在使用的代码是 ggplot d
  • ActiveRecord可以远程连接PostgreSQL并保护DB密码吗?

    我在远程 VPS 服务器 CentOS 5 上有一个 PostgreSQL 数据库 我想连接一个 Rails 应用程序 从我的本地 Mac 笔记本电脑连接到它 在我的笔记本电脑上 我安装了 ActiveRecord PostgreSQL 适
  • Apache solr 频繁添加/编辑/删除记录

    我正在考虑使用 Apache Solr 在我的数据库中 我将有大约 10 000 000 条记录 我将使用它的最坏情况有大约 20 个可搜索 可排序字段 我的问题是这些字段在一天中可能会频繁更改值 例如 在我的数据库中 我可能会同时更改 1
  • 将数组插入 mysql 数据库列

    我正在尝试将表单中的多选下拉列表中的值插入到 mysql 数据库列中 例如 下拉列表将选择一个或多个选项 然后在发布表单时将数据插入到 mysql 数据库中的一列中 我陷入了如何插入数据的困境 如果你想插入单行 那么你可以使用 implod
  • 如何获取使用 ChromeDriver 在 Azure 云服务中工作的 C# azure 服务

    我编写了一个使用 Selenium WebDriver ChromeDriver 的 C Azure 云服务 但当我将其部署到 Azure 时它不起作用 在本地运行良好 可能是因为我安装了 Chrome 我使用我的服务部署 chromedr
  • 如何添加自定义键盘

    我做了一个简单的应用程序 我的应用程序包含 10 个文本字段 我需要的是我需要隐藏默认键盘我放置手动键像这样 http b imagehost org download 0994 keypad 我该如何完成这个按键作为我的应用程序的键盘 任
  • gdb:打印二维fortran数组[重复]

    这个问题在这里已经有答案了 使用 GDB 在 Fortran 代码中打印二维数组的值时遇到问题 gdb print var 1 2 no such vector element 经过广泛的搜索后 我发现了许多关于该问题的帖子 日期为 200
  • 我可以为我的函数和类使用 PHP 保留名称吗?

    我想创建一个名为 new 的函数和一个名为 case 的类 我可以用 PHP 做到这一点吗 No http www php net manual en reserved keywords php you http codepad org z
  • 共享两个组合框的数据源

    我的 GUI 中有多个组合框 它们都需要数据 这些数据会随机变化 因此需要一种快速方法来保持所有值同步 我遇到了 DefaultComboBoxModel 它实际上非常适合 唯一的问题是 我需要组合框彼此独立 这意味着 如果我在其中选择一个