如何从Java中的其他方法检查是否启用了此复选框?

Kia*_*oss 1 java checkbox swing

我想要做的是检查是否从另一个也运行在其他线程上的方法启用了复选框.我是Java的新手,所以如果我的代码不是通常编写Java的话(或者如果编写得很糟糕的话),我会道歉.

所以我创建了一个创建iframe的方法然后添加一个复选框.我删除了创建jframe的部分只是为了保持我的代码最小 - 你可以在下面看到它:

private void initialize() {
    chckbxEnabled.setHorizontalAlignment(SwingConstants.LEFT);
    chckbxEnabled.setForeground(Color.WHITE);
    chckbxEnabled.setBounds(98, 123, 81, 23);
    frame.getContentPane().add(chckbxEnabled);
}
Run Code Online (Sandbox Code Playgroud)

然后我在一个新线程中创建了一个新方法,并从另一个我没有在这里显示的方法调用它.

static Thread thread = new Thread(new Runnable() {
public void getPing() throws IOException, InterruptedException {
    while (true) {
        System.out.println(chckbxEnabled.isEnabled());
        if(chckbxEnabled.isEnabled()) {] // Part I am having trouble with
            String apiKey = "exmapleApiKey";
            URL url = new URL("http://example.com/ping.php?mode=get&apikey="+apiKey);
            URLConnection yc = url.openConnection();
            BufferedReader in = new BufferedReader(
                                    new InputStreamReader(
                                    yc.getInputStream()));
            String inputLine;
            inputLine = in.readLine();
            }
        Thread.sleep(1000);
    }
}
   public void run() {     
       try {
            getPing();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       }
    });
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试访问chckbxEnabled.isEnabled().这是有效的,因为在我完成主要课程之后,我添加了private static JCheckBox chckbxEnabled = new JCheckBox("Enabled");.所以我可以访问它,但是true当我打印它时它总是返回,即使有时检查复选框.

所以我的问题是什么是一种更好的方法来做到这一点,因为我希望我试验过的方式是'凌乱',而不是它应该做的方式?

ted*_*ted 6

你正在混合方法:

isEnabled用于检查用户是否可以与用户交互(想想灰色元素)

isSelected正是您要找的(检查框内的复选标记).您可能想看一下ItemListener(示例)

另外:请记住,你只能形成gui线程的api.


更新: 所以:大多数gui框架只允许一个线程绘制gui,因为同步非常复杂.因此大多数摆动不是线程安全的.这里可以找到一个很好的答案(实际上与挥杆相关)

Quote:

关于线程安全的注意事项:Java平台的这么重要的部分不是线程安全的,这似乎很奇怪.事实证明,任何创建线程安全GUI库的尝试都面临着一些基本问题.有关此问题的更多信息,请参阅Graham Hamilton博客中的以下条目:MultiThreaded工具包:失败的梦想?

鉴于我们必须从单个线程中绘制gui,这意味着什么?更新操作,即更改标签文本不应该从您生成的线程中完成,而应该从运行gui代码的主线程完成(在swing中它称为事件调度线程(在swing轨迹中).如何更新gui的工作线程可以在这里找到.基本的想法是让一个背景线程进行计算并返回结果.有SwingWorker来帮助解决这个问题.然后gui thred会更新gui.

关于concurreny和swing的介绍就在这里