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

时间:2012-01-27 19:32:18

标签: java swt

这个问题让我疯狂!使用SWT,我想创建一个数字网格,我可以使用键盘进行选项卡遍历。我希望能够选择并单击每个单元格(而不仅仅是数字)来执行某些操作。换句话说,我正在寻找一种方法来制作一个真正的FLAT按钮。这里的目标是使屏幕阅读器可以访问网格,这样当一个单元格有焦点时,屏幕阅读器将读取每个单元格中间的数字值。

最初,我使用一组按钮控件创建了一个GridLayout来显示数字值。这实际上有效,但我不希望按钮看起来像按钮。按钮控件的SWT.FLAT样式在Windows操作系统上不起作用。这是由操作系统限制引起的。

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

最后,有人告诉我将每个只读文本控件包装在Composite中。这允许我将只读文本控件居中,但我不知道如何使复合本身成为选项卡遍历。

关于我如何完成这项工作或如何制作通常不需要关注的控件(如复合材料,画布,标签)的任何想法实际上都是重点关注所以我可以用键盘遍历每个控件?

我对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()); 

1 个答案:

答案 0 :(得分:0)

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

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版本(尝试更改填充,或向Composite添加边框,它可能看起来更好)。