我有一个奇怪的案例,SWT 旋转器拒绝重新绘制。
我在下面添加了一个工作示例。虽然每次单击按钮时都会调用绘制监听器,但在将鼠标移到微调器控件上之前,显示的内容不会发生变化。 (此外,如果鼠标悬停在小箭头上,文本“
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Spinner spinner = new Spinner(shell, SWT.BORDER);
spinner.addListener(SWT.Paint, e -> {
if ("overlay".equals(spinner.getData("test")) && !spinner.isFocusControl()) {
e.gc.setForeground(display.getSystemColor(SWT.COLOR_DARK_GRAY));
e.gc.drawText("<overlay>", 0, 0, false);
}
});
Button button = new Button(shell, SWT.PUSH);
button.setText("Overlay!");
button.addListener(SWT.Selection, e -> {
spinner.setData("test", "overlay");
spinner.redraw();
});
button = new Button(shell, SWT.PUSH);
button.setText("Remove");
button.addListener(SWT.Selection, e -> {
spinner.setData("test", null);
spinner.redraw();
});
shell.setSize(300, 80);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
如果您插入一个Text
小部件,一切都会按预期工作。那么 Spinner
出了什么问题?
(我正在针对 SWT 3.7 进行构建)
最佳答案
正如 @greg-449 所评论的,控件不应该由 PaintListeners
绘制。在大多数情况下,这会干扰窗口系统绘制的内容。
如果您想要覆盖,您可能需要尝试将 Canvas
放置在 Spinner
的客户区域顶部,然后在其上绘制。
覆盖控件必须从父级布局中排除,例如使用 GridData#exclude
或使用 FormLayout
。
另一个需要处理的障碍可能是发送到覆盖控件但可能需要转发到 Spinner 的鼠标事件。
当然,Spinner 上的 FocusListener
可以在 Spinner 失去或获得焦点时显示和隐藏叠加控件。
关于java - 微调器未正确重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31429677/