为什么 JCheckBox 上的 setSelected 失去作用?

2023-12-07

有人可以向我解释为什么我失去了选择(由setSelected()) for JCheckBox当我把JOptionPane进入ItemListener? 这是一个错误吗?

奇怪的是,如果这个过程被延迟invokeLater(), setSelected()正如我预期的那样工作正常。

enter image description here enter image description here

来自SSCCE

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ComponentEventDemo extends JPanel
        implements ComponentListener, ItemListener {

    private static final long serialVersionUID = 1L;
    private JFrame frame;
    private JTextArea display;
    private String newline = "\n";
    private JTextField field1;

    public ComponentEventDemo() {
        super(new BorderLayout());
        display = new JTextArea(10, 25);
        display.setEditable(false);
        JPanel panel = new JPanel(new GridLayout(0, 2));
        field1 = new JTextField();
        field1.setDisabledTextColor(Color.red);
        JCheckBox checkbox = new JCheckBox("Label visible", true);
        checkbox.addItemListener(this);
        panel.add(checkbox);
        panel.add(field1);
        panel.addComponentListener(this);
        JScrollPane scrollPane = new JScrollPane(display);
        frame = new JFrame("ComponentEventDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.add(panel, BorderLayout.SOUTH);
        frame.addComponentListener(this);
        frame.setLocation(200, 200);
        frame.pack();
        frame.setVisible(true);
    }

    public void itemStateChanged(ItemEvent evt) {
        System.out.println("STATE CHANGED!");
        if (evt.getStateChange() == ItemEvent.SELECTED) {
            //javax.swing.SwingUtilities.invokeLater(new Runnable() {

            //public void run() {
            int returnVal = JOptionPane.showConfirmDialog(display,
                    "Bla Bla Bla Text");
            if (returnVal == JOptionPane.OK_OPTION) {
                field1.setText("SELECTED - OK btn");
            } else if (returnVal == JOptionPane.NO_OPTION) {
                field1.setText("SELECTED - NO btn");
            } else if (returnVal == JOptionPane.CANCEL_OPTION) {
                field1.setText("SELECTED - Cancel btn");
            } else if (returnVal == JOptionPane.CLOSED_OPTION) {
                field1.setText("SELECTED - Close btn");
            }
            //}
            //});
        } else if (evt.getStateChange() == ItemEvent.DESELECTED) {
            field1.setText("DESELECTED");
        }
    }

    protected void displayMessage(String message) {
        display.append(message + newline);
        display.setCaretPosition(display.getDocument().getLength());
    }

    public void componentHidden(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Hidden");
    }

    public void componentMoved(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Moved");
    }

    public void componentResized(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Resized ");
    }

    public void componentShown(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Shown");

    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ComponentEventDemo ced = new ComponentEventDemo();
            }
        });
    }
}

这是一个已知的错误,由Oracle 错误 ID:6924233 The JOptionPane显然会导致生成另一个事件,并且复选框值 = false。

建议的修复方法是实例化JOptionPane using invokeLater.

Submitted On 09-MAR-2010

The change is in the BasicButtonListener -  Method focusLost()

In 1.6.0_18 it is

       ...
       ButtonModel model = b.getModel();
       model.setPressed(false);
       model.setArmed(false);

in 1.6.0_10 it was

       ...
       ButtonModel model = b.getModel();
       model.setArmed(false);
       model.setPressed(false);

(The order of the statements changed)

And a setPressed(false) with armed==true leads on an ToggleButton like 
the JCheckBox to a change of the selection (see ToggleButtonModel) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JCheckBox 上的 setSelected 失去作用? 的相关文章

随机推荐

  • 在构造函数中调用纯虚函数会出现错误[重复]

    这个问题在这里已经有答案了 class a my base class public a foo virtual void foo 0 class b public a public void foo int main b obj ERRO
  • Safari 新日期,字符串值超出不同时间[重复]

    这个问题在这里已经有答案了 我想做的是将 yyyy mm dd HH mm ss 字符串更改为日期值 这是当前的代码 var c new Date 2019 01 19 23 59 59 replace s g T 它返回 铬合金 Sat
  • 查询时出错:EXECUTE 或 OPEN 语句中主变量的值对于其相应的使用来说太大

    关于尝试使用 select 查询语句 输入变量有 8 个字符 正如预期的那样 我不知道为什么选择查询会出现此错误 因为对于选择查询 它将查询 如果可用 它将返回 否则它将重新调整空白行 使用休眠 即使在映射时 它也只能正确映射为 8 这是我
  • 使用OpenCv在IOS中裁剪圆形图像

    我正在我的项目中开发面部特征检测 到目前为止 我已经开发出检测脸部 然后找到脸部内的眼睛 我想把眼睛剪成圆形 circle mask center radius cv Scalar 255 255 255 1 8 0 image copyT
  • SQL Server 2008 R2 中的空间会降低性能

    我遇到了一个相当奇怪的问题 我在 SQL Server 中创建了以下查询 SELECT FROM leads BatchDetails T1 INNER JOIN leads BatchHeader h ON T1 LeadBatchHea
  • 矩阵的成对偏相关,由一个变量控制

    我有一个 100 列的表 我想对其运行成对偏相关 使用第 100 列的变量进行控制pcor test函数从ppcor包裹 R 中是否有任何偏相关函数 我可以使用类似的返回值rcorr 取整个矩阵的成对相关性但仅由一个变量控制 听起来对于一个
  • 无法安装 mongoose npm

    我正在将 mongoose 安装为 npm 我返回了一堆错误 我做了一个 npm 安装npm install g 节点 gyp从我读到的有类似问题的帖子中 然而 我的问题似乎并没有消失 我无法解决此警告的问题 任何见解将不胜感激 lib k
  • java.lang.NoClassDefFoundError: org/apache/commons/exec/Executor

    我试图执行下面的代码 但在运行时出现错误 java lang NoClassDefFoundError org apache commons exec Executor 我也添加了 Common Exec jar 文件 但它不起作用 我需要
  • 目标文件“版本引用”从哪里来?

    目前我所在的目录中有一个文件libshared object so 为了通用而更改名称 当我跑步时 objdump p libshared object so 我收到以下输出 libshared object so file format
  • 读取系统调用表函数地址时内核模块崩溃

    我正在研究 rootkit 并尝试挂钩系统调用表 由于我已经可以从 boot System map uname r 动态检索表的地址 因此我跟踪了代码的有问题的部分并将其隔离到一个独立的 更简单的模块中 如下所示 它尝试检索并显示 Kill
  • 如何计算R中特定行的平均值?

    我有一个数据文件 如下例所示 但更大 names num Y1 Y2 William 1 4 71 7 4 William 2 3 75 8 William 3 4 71 7 9 Katja 1 5 83 8 5 Katja 2 5 17
  • VStack 中大 Text 和 TextField 之间的 SwiftUI 神秘间距

    我无法弄清楚为什么我的文本下方有一些空格 struct testView View State private var notes var body some View VStack Text Larg Text font system s
  • 为什么这个值是空的?

    我正在成功地制作 保存和检索我的共享偏好mainActivity 但我无法从我的服务中获取它 由于某种原因 当我尝试从后台服务检索它时 我的共享首选项为空 我在 onCreate 中初始化我的首选项 contactsPrefs getSha
  • AngularJS:链接承诺

    遵循以下建议AngularJS 验证和承诺 我想链接确认对话框 从而一次验证多个步骤 根据用户提供的数据 调用API来查看哪些内容需要用户确认 对于每一个需要确认的步骤 提示用户并让他们决定是否进入下一步 如果任何步骤返回 false 则整
  • 如何替换 perl 中的空格

    chomp myString myString s g 我可以用这两个替换吗 myString s s g 有什么区别吗 请解释 您的第一个代码将从 myString 末尾取出换行符 如果存在 然后删除所有 字符 第二行代码将删除所有空白字
  • 为什么整数 0 等于 PHP 中的字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 相等 双等于 和恒等 三等于 比较运算符有何不同 Why this var dump 0 string 输出这个 bool true 上下文不是 运算符应该转换0 into FALSE and str
  • 删除重写方法中的抛出,编译器在调用时需要一个 try/catch 块

    我有一个子类 并且要重写继承的父方法 我要从方法声明中删除 throws 子句 现在 使用多态性 my 实例的运行时类型应该确定方法实现 然而 当我尝试编译时 编译器抱怨并希望在方法调用周围有一个 try catch 块 就好像正在调用超类
  • 尝试从 PHP 运行 jar

    在阅读了该网站上与我遇到的完全相同的问题相关的一些帖子后 我发现它们都没有给我一个成功的结果 如何使用 PHP 从 Web 服务器运行 jar 从网站上的 PHP 脚本运行 Java 类文件 为什么 exec java jar file j
  • 制作特定结构的矩阵

    请注意 我不知道我错在哪里 但我花了一整天的时间试图解决这个问题 因此 我请求不要将其作为重复问题丢弃 并将其视为与矩阵结构相关的非常具体的问题 我有以下数据框 dput c m q structure list ASK Price c 1
  • 为什么 JCheckBox 上的 setSelected 失去作用?

    有人可以向我解释为什么我失去了选择 由setSelected for JCheckBox当我把JOptionPane进入ItemListener 这是一个错误吗 奇怪的是 如果这个过程被延迟invokeLater setSelected 正