Java SWT-创建一个数字网格,我希望能够通过键盘进行制表

Java SWT-创建一个数字网格,我希望能够通过键盘进行制表,java,swt,Java,Swt,这个问题快把我逼疯了!!!使用SWT,我想创建一个数字网格,我可以使用键盘遍历它。我希望能够选择并点击每个单元格,而不仅仅是数字来执行一些操作。换句话说,我正在寻找一种方法来制作一个真正的平面按钮。这里的目标是使网格可以通过屏幕阅读器访问,这样当一个单元有焦点时,屏幕阅读器将读取每个单元中间的数值。 最初,我创建了一个GridLayout,其中包含一组按钮控件来显示数值。这确实有效,但我不希望按钮看起来像按钮。按钮控件的SWT.FLAT样式在Windows操作系统上不起作用。这是由操作系统限制引

这个问题快把我逼疯了!!!使用SWT,我想创建一个数字网格,我可以使用键盘遍历它。我希望能够选择并点击每个单元格,而不仅仅是数字来执行一些操作。换句话说,我正在寻找一种方法来制作一个真正的平面按钮。这里的目标是使网格可以通过屏幕阅读器访问,这样当一个单元有焦点时,屏幕阅读器将读取每个单元中间的数值。 最初,我创建了一个GridLayout,其中包含一组按钮控件来显示数值。这确实有效,但我不希望按钮看起来像按钮。按钮控件的SWT.FLAT样式在Windows操作系统上不起作用。这是由操作系统限制引起的

接下来,我尝试将所有按钮转换为标签,但由于标签控件无法聚焦,因此无法实现任何类型的选项卡遍历。接下来,我尝试用只读文本控件替换所有标签。我能够重新引入制表符遍历/聚焦,但我无法让文本显示在每个单元格的死点。这实际上是由SWT限制引起的。文本控件的SWT.CENTER样式仅影响水平对齐。文本控件不能垂直对齐

最后,有人告诉我把每个只读文本控件包装成一个复合控件。这允许我将只读文本控件居中,但我不知道如何使组合本身被遍历

关于如何完成这项工作,或者如何制作通常不需要聚焦的控件(如合成控件、画布控件、标签控件)是否有任何想法,以便我可以使用键盘对每个控件进行tab遍历

我对java和SWT相当陌生,因此,如果其中一些内容令人困惑,我很抱歉。非常感谢。这就是我构建每个单元格的方式。到目前为止,我已将只读文本替换为CLabel控件:

Display display = new Display();
Shell shell = new Shell(display); 

GridLayout gridLayout = new GridLayout(5, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = 1;
gridLayout.verticalSpacing = 1;
shell.setLayout(gridLayout);    

Composite resetComp = new Composite(shell, SWT.BORDER);
GridData compgridData = new GridData(SWT.CENTER, SWT.CENTER, true, true);
GridData resetGD = new GridData(SWT.FILL, SWT.FILL, false, false);
resetGD.verticalSpan = 2;    
resetComp.setLayoutData(resetGD);
resetComp.setLayout(new GridLayout(1, false));  

CLabel resetCLabel = new CLabel(resetComp, SWT.SHADOW_OUT | SWT.CENTER);
resetCLabel.setText("Reset"); //$NON-NLS-1$
resetCLabel.setLayoutData(compgridData);
resetCLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); //$NON-NLS-1$

resetComp.setToolTipText(resetCLabel.getText()); 

这里有一个技巧,也许它适合你:在一个组合中创建每个按钮,并将按钮的大小设置为大于其父组合;这样,按钮的边框不可见,因为位于其父组合的外部

private static final int GRID_SIZE = 5;
private static final int CELL_SIZE = 40;
private static final int PADDING = 3;

public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell (display);
    shell.setLayout(new GridLayout(GRID_SIZE, true));

    for (int i = 0; i < GRID_SIZE * GRID_SIZE; i++) {
        createButton(shell, i+1);     
    }

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

private static void createButton(Shell shell, final int number) {
    Composite c = new Composite(shell, SWT.NONE);
    c.setLayoutData(new GridData(CELL_SIZE, CELL_SIZE));

    Button button = new Button(c, SWT.NONE);
    button.setText(Integer.toString(number));
    button.setBounds(-PADDING, -PADDING, CELL_SIZE + 2 * PADDING, CELL_SIZE + 2 * PADDING);

    button.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            System.err.println("click on " + number);
        }
    });
}

它满足了你的要求:专注,居中。根据Windows版本的不同,结果可能会或多或少好一些。如果尝试更改填充,或为合成图添加边框,效果可能会更好。

合成图上的焦点是什么?你打算把它画得不一样吗?哇。这真是不可思议的聪明。