我有一个奇怪的案例,SWT微调器拒绝重新绘制。
我在下面添加了一个工作示例。在每次单击按钮时调用绘图侦听器时,在将鼠标移到微调控件上之前,显示的内容不会发生任何变化。 (此外,如果鼠标悬停在小箭头上,那么也会在那里绘制“< overlay>”文本。)
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)
答案 0 :(得分:0)
作为@ greg-449评论,PaintListeners
并不打算使用控件。在大多数情况下,这会干扰窗口系统的绘制。
如果您想要叠加,可能需要尝试将Canvas
置于Spinner
的客户区域顶部,然后在其上绘制。
必须从父母的布局中排除叠加控件,例如使用GridData#exclude
或使用FormLayout
。
处理的另一个障碍可能是发送到叠加控件的鼠标事件,但可能需要转发给Spinner。
当然,Spinner上的FocusListener
会在Spinner失去或获得焦点时显示和隐藏叠加控件。