我可以设置 JList 的选定项目而不向侦听器抛出事件吗?

2023-12-09

我正在开发一个查看器,它使用 JList 来显示文档页面的缩略图。用户可以通过在 JList 中选择页面或通过其他机制(例如在文本框中输入数字)来打开页面。

当使用后一种选择时,我希望 JList 也选择该页面。我使用 setSelectedIndex() 执行此操作,但这会触发一个事件,导致页面再次加载,就好像用户单击并选择了 JList 中的页面一样,这给我带来了一些问题。

在我看来,应该以某种方式设置索引(可能在模型中),以便仅更新 JList 的 UI,而不会触发索引已更改的事件。

这可能吗?或者有更好的方法来解决我的问题吗?


  1. 您可以删除所有ListSelectionListener从列表中进行选择,然后再次添加它们。

  2. 您可以创建自己的ListSelectionModel使用一种不会引发事件并将其设置为您的选择模型的方法JList,然后使用getSelectionModel().yourSelectIndexMethod(index).

  3. 您也可以将所有其他选择方式都转移到列表中,如果通过其他方式选择页面,只需找到相应的条目,然后在列表中选择该项目即可。这样,项目就会被选中,页面就会加载一次。

选项 2 的代码:

public class ListTest extends JPanel{

private static final String[] items = new String[]{"1", "2", "3"};
private JList mylist;
private JComboBox myCombo;
private JTextArea myTA;

public ListTest() {
    setLayout(new BorderLayout());
    myCombo = new JComboBox(items);
    myCombo.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e){
            valueSelectedCombo(myCombo.getSelectedIndex());
        }
    });
    JPanel pn = new JPanel();
    pn.setLayout(new BoxLayout(pn, BoxLayout.X_AXIS));
    pn.add(myCombo);
    pn.add(Box.createHorizontalGlue());
    pn.add(new JButton(new AbstractAction("Clear"){

        @Override
        public void actionPerformed(ActionEvent e){
            myTA.setText("");
        }
    }));
    add(pn, BorderLayout.NORTH);
    add(new JScrollPane(getJList()), BorderLayout.WEST);
    add(new JScrollPane(myTA = new JTextArea()), BorderLayout.CENTER);
}

private void valueSelectedList(int index){
    myTA.setText(myTA.getText() + "\n" + items[index]);
}

private void valueSelectedCombo(int index){
    myTA.setText(myTA.getText() + "\n" + items[index]);
    ((CustomSelectionModel)mylist.getSelectionModel()).setSelectionSilent(index);
}

private JList getJList(){
    if (mylist == null){
        mylist = new JList(items);
        mylist.setSelectionModel(new CustomSelectionModel());
        mylist.addListSelectionListener(new ListSelectionListener(){

            @Override
            public void valueChanged(ListSelectionEvent e){
                if (!e.getValueIsAdjusting()){
                    valueSelectedList(mylist.getSelectedIndex());
                }
            }
        });

        mylist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        mylist.setPreferredSize(new Dimension(100, 106));

    }
    return mylist;
}

private static class CustomSelectionModel extends DefaultListSelectionModel{

    private boolean isSilent = false;

    public void setSelectionSilent(int firstIndex){
        isSilent = true;
        setSelectionInterval(firstIndex, firstIndex);
        isSilent = false;
    }
    protected void fireValueChanged(int firstIndex, int lastIndex, boolean isAdjusting){
        if (isSilent){
            return;
        }
        super.fireValueChanged(firstIndex, lastIndex, isAdjusting);
    }
}

public static void main(String[] args){
    JFrame frame = new JFrame("test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Add content to the window.
    frame.add(new ListTest());

    // Display the window.
    frame.pack();
    frame.setSize(300, 200);
    frame.setVisible(true);
}

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

我可以设置 JList 的选定项目而不向侦听器抛出事件吗? 的相关文章

  • 使用 Eclipse 将具有外部依赖项的 Java 项目导出到 jar

    有没有一种简单的方法可以将 Java 项目 包括其所有外部依赖项 导出到标准 jar 文件 我开发了一个使用多个 Apache 库的 SDK 我希望能够将该项目作为单个 jar 发布 到目前为止我找到的这个问题的答案要求将项目打包为 Run
  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • 在 C# 中引发事件[重复]

    这个问题在这里已经有答案了 我在微软练习测试中遇到了这个问题 我很困惑 这是问题 以下哪个 C 代码示例 是引发事件的正确方式 假设警报事件 AlarmEventArgs 类 以及 AlarmEventHandler 委托已 宣布 这是他们
  • 按位运算符简单地翻转整数中的所有位?

    我必须翻转整数的二进制表示形式中的所有位 鉴于 10101 输出应该是 01010 当与整数一起使用时 完成此操作的按位运算符是什么 例如 如果我正在编写类似的方法int flipBits int n 什么会进入身体 我只需要翻转数字中已经
  • 如果主引用指向 null,WeakReference 或 SoftReference 有何不同

    我正在读关于WeakReference https docs oracle com javase 10 docs api java lang ref WeakReference html and SoftReference https do
  • 使用 Hibernate Criteria 过滤 Map 中的键和值

    我有以下持久类 public class Code ElementCollection targetClass CodeValue class MapKeyClass CodeProperty class JoinTable name co
  • 外部实体更改后索引不更新

    我目前正在开发一个项目 使用 JPA 2 1 保存数据并使用 hibernate search 4 5 0 final 搜索实体 映射类和索引后 搜索工作正常 但是 当我更改值时描述B 类从 someStr 到 anotherStr 数据库
  • 如何修复maven错误JAVA_HOME环境变量未正确定义

    当我在虚拟环境中检查maven的版本时 出现以下错误 The JAVA HOME environment variable is not defined correctly This environment variable is need
  • Hazelcast:连接到远程集群

    我们有一组 Hazelcast 节点 全部运行在一个远程系统 具有许多节点的单个物理系统 上 我们希望从外部客户端连接到该集群 一个 Java 应用程序 它使用如下代码连接到 Hazelcast ClientConfig clientCon
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • 用于安装 R 软件包的备用编译器:clang:错误:不支持的选项“-fopenmp”

    我正在尝试在 OS X 10 11 6 上使用 R 版本 3 4 0 安装 rJava 包 install packages rJava type source 我收到以下错误 clang o libjri jnilib Rengine o
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 使用 Commons 或 Guava 将文本文件转换为 Java Set

    我想将文件中的每一行加载到 HashSet 集合中 有没有一种简单的方法可以做到这一点 怎么样 Sets newHashSet Files readLines file charSet 使用番石榴 参考 文件 readLines http
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • 返回 MS Access 中每组的增量组编号

    我需要帮助在 Access 中创建一个查询 以递增地对行组进行编号 在公共日期进行分组 并在下一个日期保留 组编号 增量 如 结果 列中显示的那样 日期 ID 结果 2017 01 09 809 1 2017 01 09 810 1 201
  • 复杂表合并 javascript 和 jquery 算法

    我有一个相当独特的问题 无法解决 我有一张 2 x 3 的桌子 排列如下图所示 1 2 1 像这样 http jsfiddle net 4zGvg 适用于任意行 列 想法 我们有values矩阵和span矩阵 的价值观span are 0
  • 是否有适用于 .NET(C# 或 VB.NET)的 UPnP 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在开发一个 P2P 应用程序 我需要让它使用 UPnP 通过 NAT 路由器 防火墙进行通信 但是 NET Framework 似乎不包含对 U
  • strftime() 函数显示不正确的时间

    The strftime php 中的函数在我的系统上没有显示正确的时间 我在 xampp 上运行 php 我的电脑时钟大约是 11 点 但功能strftime 当我执行以下代码时返回 19 echo Time is strftime H
  • 释放 Solaris/Linux 中分配的内存

    我编写了一个小程序 并在 Solaris Linux 平台下编译它 以测量将此代码应用于我的应用程序的性能 该程序是这样编写的 最初使用sbrk 0 系统调用 我已经获取了堆区域的基地址 之后我使用分配了 1 5 GB 内存malloc系统
  • R dplyr:使用字符串函数重命名变量

    有点相关的问题 在 dplyr 的重命名函数中以字符串形式输入新列名称 在中间一个dplyr chain gt 我想用旧名称的函数替换多个列名称 使用tolower or gsub etc library tidyr library dpl
  • 在 twilio 中发送短信返回 21603:需要“发件人”号码

    这是一个常规资金帐户 它将坚持没有发件人号码 我也尝试作为请求参数而不是请求正文 SID和TOKEN是正确的 通过修改它们进行测试并获得适当的错误 与 twilio 库配合良好 而不是作为独立的 POST POST 2010 04 01 A
  • Visual Studio Winform 设计器:在当前控件 BindingSource 上设置 DataBindings

    我正在使用 Visual Studio 2013 设计器在 Winforms 中创建 UserControl 它包含一个文本框 我添加了一个 BindingSource 其 DataSource 属性在代码中设置为列表 当我单击文本框时 查
  • 快速写入文件(iOS)

    如何在 Swift 中写入 xml 文档 我有这个代码 let content
  • Python记录器:不会覆盖原始日志?

    因此 当我将以下 x 次复制粘贴到 python 提示符时 它将日志 x 次添加到指定文件的末尾 如何更改代码 以便每次我将其复制粘贴到提示符中时 我只是覆盖现有文件 代码似乎不接受mode w 选项或者我似乎不明白它的含义 def Min
  • 在javascript中设置新窗口的回调函数

    有没有一种简单的方法可以为在 javascript 中打开的新窗口设置 回调 函数 我想从新窗口运行父级的函数 但我希望父级能够设置此特定函数的名称 因此不应在新窗口页面中对其进行硬编码 例如在父级中我有 function DoSometh
  • 将“MediaPlayPause”键发送到应用程序而不将焦点设置到该应用程序

    我正在创建一个程序 它将发送媒体键输入 例如MediaPlayPause MediaNextTrack等 到我有的应用程序IntPtr的 有点像虚拟遥控器 所以经过研究我发现this which almost准确地告诉我如何解决我的问题 然
  • 如何使用 Xpath 获取纯文本

    你好 我得到了这段 html 我想从中获取文本元素 span class h1 Toltec Lighting 216 BRZ 508 Leaf Collection Traditional Potrack With Italian Mar
  • 将 IEEE 浮点十六进制转换为十进制?

    如果我有一个 IEEE 浮点十六进制 42F6E979 如何将其转换为十进制 我相信十进制表示是 123 456001 大多数 汇编语言实际上并没有非常严格地强制执行类型 因此您只需使用该值初始化一个位置 然后将其视为 使用浮点数 最简单的
  • Djs 交互与嵌入分开发送附件

    我试图让我的消息看起来像this 但由于interaction reply I get this反而 这是我的代码 fs readdir pics error files gt if error return console log err
  • 在视频播放时调整/缩小 YouTubePlayerFragment 的大小

    我正在尝试在 Youtube 应用程序中复制视频最小化 如图所示here 为了实现这一目标 我尝试使用可拖动面板图书馆 当我运行示例时 我注意到视频在播放过程中最小化时不会缩放 而是会裁剪 当视频停止 不是暂停 并显示缩略图时 视图会按预期
  • 如何克服Excel中公式的最大长度限制? excel的一个bug?

    Excel 中至少有两种形式的公式 一个用于单元格 另一个用于数据验证 进行数据验证的公式的最大长度限制约为 210 个字符 这是我试图解决的一个问题 给定一个包含类别和值的数据集 category value1 value2 a 1 0
  • Android 静默 apk 更新

    我希望在我的应用程序中进行静默更新 无需任何用户交互 但我总是收到错误代码 139 硬件已root 有人可以帮忙吗 这是代码 public class UpdateAPK extends Activity protected void on
  • 是否可以“缓冲”循环中发生的 DOM 更改(以提高性能)?

    为了清楚地说明我的要求 这是我的例子 fiddle 我有一个大约 500 个随机名称的列表 我在顶部有一个具有实时搜索功能的输入 在每一个keyup 获取输入的值 并且列表中的每个项目都与其匹配 不匹配的项目将被隐藏 主观上来说 表现是ok
  • 我可以设置 JList 的选定项目而不向侦听器抛出事件吗?

    我正在开发一个查看器 它使用 JList 来显示文档页面的缩略图 用户可以通过在 JList 中选择页面或通过其他机制 例如在文本框中输入数字 来打开页面 当使用后一种选择时 我希望 JList 也选择该页面 我使用 setSelected