旋转器未正确重绘

时间:2015-07-15 11:54:40

标签: java swt

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

1 个答案:

答案 0 :(得分:0)

作为@ greg-449评论,PaintListeners并不打算使用控件。在大多数情况下,这会干扰窗口系统的绘制。

如果您想要叠加,可能需要尝试将Canvas置于Spinner的客户区域顶部,然后在其上绘制。

必须从父母的布局中排除叠加控件,例如使用GridData#exclude或使用FormLayout

处理的另一个障碍可能是发送到叠加控件的鼠标事件,但可能需要转发给Spinner。

当然,Spinner上的FocusListener会在Spinner失去或获得焦点时显示和隐藏叠加控件。