gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:30:36 25 4
gpt4 key购买 nike

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

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

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

最后,有人告诉我将每个只读文本控件包装在一个 Composite 中。这使我能够将只读文本控件居中,但我不知道如何使复合本身进行制表符遍历。

关于如何完成此操作或如何使通常不获取焦点的控件(例如复合、 Canvas 、标签)实际上获得焦点,以便我可以使用键盘按 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());

最佳答案

这里有一个技巧,也许它会适合你:在 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 添加边框,它可能看起来更好)。

关于java - SWT - 创建一个数字网格,我希望能够使用键盘进行切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com