SWT - 从 Shell 中的按钮/控件中移除焦点

问题描述 投票:0回答:3

我有一个包含几个按钮的窗口(该窗口充当起始页)。当我第一次创建并打开

Shell
时,创建的第一个
Button
被分配焦点。有没有办法把焦点从这个
Button
移开?

使用

SWT.NO_FOCUS
没有帮助。

java button focus swt
3个回答
5
投票

您可以只关注您的 shell,而不是创建虚拟/不必要的按钮:

shell.open();
shell.forceFocus();

这至少在 gtk 中可以解决问题。


0
投票

也许最简单的解决方法是使用以下步骤:

  1. 创建一个不执行任何操作的虚拟按钮
  2. 将焦点分配给该按钮
  3. 隐藏它(将其放置在看不见的位置)

如果您使用

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()


0
投票
Button button=new Button(shell, SWT.PUSH);
button.setVisible(false); // hide & avoid focus
shell.setDefaultButton(button);
© www.soinside.com 2019 - 2024. All rights reserved.