java - 微调器未正确重绘

标签 java swt

我有一个奇怪的案例,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/

相关文章:

java - 当我可以在 Spring JPA 中编写方法时为什么还需要 @Query

java - 如何将 "fraction of day"转换为 Java 时间?

java - 使用 Project Lombok 的模糊方法调用

java - 第二次尝试打开 Shell 时如何修复 Widget is Disposeed 错误?

java - 如何使用 Java Swing 布局整齐地缩进一些组件

java - 如何将 "mvn spring-boot:run"重命名为 "mvn someName:run"?

包含管道和换行符的Java Split字符串

java - 发现未知的扩展标签 : Eclipse Plugin Development

ubuntu - LIBDBUSMENU-GTK-CRITICAL 在 Ubuntu 11.10 下退出 RCP 应用程序

java - 使用 shell 和对齐按钮调整表的大小?