【问题标题】:check-box always returns true .getSelection();复选框始终返回 true .getSelection();
【发布时间】:2014-06-25 15:21:22
【问题描述】:

在 Java 项目中,我使用 swt 小部件按钮作为复选框。 I have read the java docs 和我需要检查该框是否被选中的功能似乎是 Button.getSelection()。在我的实现中,无论我是否选择了该框,它似乎总是返回 true。

setChecks 在开始时调用,然后在按下按钮时调用 getFilter。 复选框按预期显示,我可以取消选择其中一些,但是当我按下按钮时,getFilter 中的打印行对每个按钮都返回 true。

void setChecks(String[] s){
    button=new Button[s.length];
    bool = new boolean[button.length];
    for(int i=0;i<s.length;i++){
        button[i] = new Button(shell,  SWT.CHECK);
        button[i].setSelection(true);
        button[i].setBounds(449, 209+(20*i), 174, 16);
        button[i].setText(s[i]);
        //System.out.println(s[i]);
    }
}
private boolean[] getFilter() {
    bool = new boolean[button.length];
    for (int i=0; i<bool.length;i++){
        bool[i]=button[i].getSelection();
        System.out.println(button[i].getSelection());
    }
    return bool;
}

编辑:

修改代码:

button[i].addSelectionListener(new SelectionListener(){
            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                // TODO Auto-generated method stub
                Button b = (Button)arg0.getSource();
                b.setSelection(!b.getSelection());
            }
        });

【问题讨论】:

  • 请注意:除非绝对必要,否则使用setBounds() 是不好的做法,请改用Layout。如果您还没有,请阅读:Understanding Layouts in SWT.
  • 这看起来不错,我以后可能会转换,GUI 对象不是我的强项,所以我目前正在使用生成边界的 eclipse gui 编辑器。在设计方面,我正在研究功能,我可能会在那时对其进行转换。

标签: java eclipse checkbox swt


【解决方案1】:

您总是将其设置为true by

button[i].setSelection(true);

这就是为什么你总是真实的。做出选择后,您需要设置button。你有一个监听器连接到它。你必须使用

 void addSelectionListener(SelectionListener listener) 

将侦听器添加到侦听器集合中,当用户选择控件时,将通过向其发送在 SelectionListener 接口中定义的消息之一来通知这些侦听器。

请阅读SelectionListener 上的文档。你必须使用

void widgetSelected(SelectionEvent e)

在控件中发生选择时发送。

void widgetDefaultSelected(SelectionEvent e)

在控件中发生默认选择时发送。

【讨论】:

  • 我知道我正在使用它将其设置为 true,我希望该框开始被选中,并且当用户在运行时单击该框时不会自动切换选择吗?我想是的。
  • 不,当您在控件中设置时,它不会自动设置。您需要附加监听器并监听事件并以编程方式实现选择
  • 我已经添加了修改后的代码,但这似乎将复选框更改为 false,然后当我单击它时又恢复为 true。
【解决方案2】:

这是我找到的解决方案,然后访问 bool,而不是调用 getFilters。

void setChecks(String[] s){
    button=new Button[s.length];
    bool = new boolean[button.length];
    for(int i=0;i<s.length;i++){
        button[i] = new Button(shell,  SWT.CHECK);
        button[i].setSelection(true);
        bool[i]=true;
        button[i].addSelectionListener(new SelectionListener(){
            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                Button b = (Button)arg0.getSource();
                for (int i=0;i<button.length;i++){
                    if (button[i].getText()==b.getText())bool[i]=!bool[i];
                }
            }
        });
        button[i].setBounds(449, 209+(20*i), 174, 16);
        button[i].setText(s[i]);
    }
}

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 2014-07-07
    • 2016-03-30
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多