如何为不同的单选按钮定义不同的行为 - Java的SWT

时间:2014-02-17 18:49:29

标签: java swt eclipse-rcp eclipse-plugin

请考虑以下代码:

public class SWTTest {

    public static void main(String[] args) {

        Display display=new Display();
        Shell shell=new Shell(display, SWT.DIALOG_TRIM);

        Group group=new Group(shell, SWT.SHADOW_ETCHED_OUT);
        group.setText("A group");

        Button[] options=new Button[2];
        options[0]=new Button(group, SWT.RADIO);
        options[0].setText("Option 1");
        options[0].setLocation(5, 20);
        options[0].pack();

        options[1]=new Button(group, SWT.RADIO);
        options[1].setText("Option 2");
        options[1].setLocation(5, 50);
        options[1].pack();

        options[0].addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                System.out.println("Option 1 Selected");                
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                // TODO Auto-generated method stub

            }

        });


        group.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) 
                display.sleep();
        }
        display.dispose();
    }
}

我的意图是,只要选择了选项1,就会调用widgetSelected(SelectionEvent e)方法,然后 ,但问题是选择选项2 调用widgetSelected(SelectionEvent e)方法,即使我没有提交选项2作为监听器,也没有为它实现widgetSelected(SelectionEvent e)方法。
那么这里发生了什么,我如何为不同的选项选择定义不同的行为?


修改

哦......还有一件事......
如果我对实现widgetDefaultSelected(SelectionEvent e)方法不感兴趣怎么办?我应该这样离开吗?

1 个答案:

答案 0 :(得分:1)

正如 Edward Thomson 在评论中提到的那样, SelectionEvent 会在按钮 上触发选择以及取消选择

您的 EventListener 应该检查按钮状态:

button.getSelection() // return true if the button is selected

这就是我通常的做法:

Button button = new Button(parent , SWT.RADIO);
button.addSelectionListener(new SelectionAdapter(){
    @override
    public void widgetSelected(final SelectionEvent e){
        super.widgetSelected();
        if(button.getSelection()){
            //do your processing
        }
    }
});