我有一个包含几个按钮的窗口(该窗口充当起始页)。当我第一次创建并打开
Shell
时,创建的第一个 Button
被分配焦点。有没有办法把焦点从这个Button
移开?
使用
SWT.NO_FOCUS
没有帮助。
您可以只关注您的 shell,而不是创建虚拟/不必要的按钮:
shell.open();
shell.forceFocus();
这至少在 gtk 中可以解决问题。
也许最简单的解决方法是使用以下步骤:
如果您使用
FormLayout
,这是最容易完成的:
Button dummy = new Button(parent, SWT.PUSH)
dummy.setFocus()
FormData data = new FormData();
data.bottom = new FormAttachment(-1);
dummy.setLayoutData(data);
这是假设父级
Composite
的 clientArea
占据整个窗口,或者位于顶部。
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SOClass {
public static void main(String[] args) {
Display d = new Display();
Shell shell = new Shell(d);
shell.setSize(500, 500);
shell.setText("Remove focus from first button");
shell.setLayout(new FillLayout());
Composite comp = new Composite(shell, SWT.NONE);
comp.setLayout(new FormLayout());
int style = SWT.PUSH | SWT.BORDER;
Button b1 = new Button(comp, style);
Button b2 = new Button(comp, style);
b1.setText("Button 1");
//position: top, spanning the majority of the windows width
FormData b1Data = new FormData();
b1Data.top = new FormAttachment(0, 5);
b1Data.left = new FormAttachment(0, 5);
b1Data.right = new FormAttachment(100, -5);
b1.setLayoutData(b1Data);
b2.setText("Button 2");
//position: under b1, spanning the majority of the windows width
FormData b2Data = new FormData();
b2Data.top = new FormAttachment(b1, 5);
b2Data.left = new FormAttachment(0, 5);
b2Data.right = new FormAttachment(100, -5);
b2.setLayoutData(b2Data);
//try removing/commenting this section to see the effect
Button dummy = new Button(comp, style);
dummy.setFocus();
FormData dummyData = new FormData();
dummyData.bottom = new FormAttachment(-1);
dummy.setLayoutData(dummyData);
shell.open();
while (!shell.isDisposed()) {
if(!d.readAndDispatch())
d.sleep();
}
d.dispose();
}
}
虚拟按钮仍然可用,您仍然可以单击它(以物理方式和编程方式),但它不可见,因此对于用户来说,按钮看起来像是没有分配焦点。
Button.setVisible(false)
对此不起作用 - 该按钮被 SWT 识别为隐藏,因此 SWT 会查找下一个按钮来给予焦点。
如果您需要再次删除任何按钮上的焦点,只需使用
dummy.setFocus()
Button button=new Button(shell, SWT.PUSH);
button.setVisible(false); // hide & avoid focus
shell.setDefaultButton(button);