SWT创建的首个RADIO单选按钮始终默认选中,如何实现初始全部未选?
根本原因
SWT 的 SWT.RADIO 类型按钮默认遵循「同一互斥组内必须有且仅有一个选中项」的规则。你给分组组件设置了 SWT.NO_RADIO_GROUP 参数,相当于禁用了分组容器的自动分组逻辑,导致所有局的单选按钮都被归到了同一个全局隐式互斥组中。全局组必须保留一个选中项,因此第一个创建的单选按钮会被默认选中,单独调用 setSelection(false) 会因为系统找不到同组其他可选中项而被自动重置,所以无法生效。
可行解决方案
方案1:添加隐藏占位单选按钮(改动最小)
每创建一局的界面时,在当前局的复合组件(层级b)内新增一个不可见的单选按钮作为占位项,初始默认选中这个隐藏按钮,即可让两个可见的队伍单选按钮都处于未选中状态,完全符合初始需求,不会影响后续用户操作。
示例代码:
// 每局b组件初始化时先创建隐藏占位按钮 Button placeholderRadio = new Button(bComposite, SWT.RADIO); placeholderRadio.setVisible(false); // 再创建左右两队的可见单选按钮 Button leftWinRadio = new Button(leftGroup, SWT.RADIO | SWT.RIGHT); leftWinRadio.setText("Winner!"); Button rightWinRadio = new Button(rightGroup, SWT.RADIO | SWT.RIGHT); rightWinRadio.setText("Winner!"); // 初始选中隐藏按钮,两个可见按钮默认未选中 placeholderRadio.setSelection(true);
方案2:改用CHECK按钮自定义互斥逻辑(可控性最高)
完全放弃SWT内置的RADIO互斥逻辑,改用SWT.CHECK样式的按钮,自行实现同局内两个按钮的互斥逻辑,从根源上规避隐式分组带来的默认选中问题,后续多局扩展也不会出现串扰。
示例代码:
// 按钮改用CHECK样式 Button leftWinRadio = new Button(leftGroup, SWT.CHECK | SWT.RIGHT); leftWinRadio.setText("Winner!"); Button rightWinRadio = new Button(rightGroup, SWT.CHECK | SWT.RIGHT); rightWinRadio.setText("Winner!"); // 自定义互斥选中逻辑 leftWinRadio.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (leftWinRadio.getSelection()) { rightWinRadio.setSelection(false); } } }); rightWinRadio.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (rightWinRadio.getSelection()) { leftWinRadio.setSelection(false); } } }); // 初始状态可直接设置为未选中,不会被系统自动重置 leftWinRadio.setSelection(false); rightWinRadio.setSelection(false);
内容的提问来源于stack exchange,提问作者Big Guy
相关产品推荐
相关产品推荐

