这不是How to set SWT button foreground color?的重复。这更像是一次跟进。我写了后续问题作为评论,但没有得到任何答复,所以我想我会把它作为一个问题提出来,希望有些专家会看到它。
正如引用的问题所指出的,Windows原生按钮小部件不支持设置前景色(事实上,经过更多的进一步研究(更像实验),已经发现setForeground()在经典主题下工作,但是不是其他人。)
在引用的问题中给出的答案/建议是一个很好的答案(a.k.a提供一个绘画监听器并用正确的颜色绘制文本)。我给了它一个旋转,但遇到了一个问题世界,试图决定绘制文本的坐标:
看起来 - 除了像对齐等SWT属性之外 - Windows还有一些很难确定的决定文本位置的规则。更糟糕的是,该位置似乎取决于有效的Windows主题。由于我需要在本机绘制的Windows文本上绘制文本以覆盖颜色,这是一个很大的问题。
请有人在这里提供一些急需的帮助吗?非常感谢!
谢谢!
答案 0 :(得分:2)
在用于绘制彩色背景的同一PaintListener
上,您必须计算位置并绘制文本。这是我们在这里做的方式:
public void paintControl( PaintEvent event ) {
// Is the button enabled?
if ( !isEnabled() ) {
return;
}
// Get button bounds.
Button button = (Button)event.widget;
int buttonWidth = button.getSize().x;
int buttonHeight = button.getSize().y;
// Get text bounds.
int textWidth = event.gc.textExtent( getText() ).x;
int textHeight = event.gc.textExtent( getText() ).y;
// Calculate text coordinates.
int textX = ( ( buttonWidth - textWidth ) / 2 );
int textY = ( ( buttonHeight - textHeight ) / 2 );
/*
* If the mouse is clicked and is over the button, i.e. the button is 'down', the text must be
* moved a bit down and left.
* To control this, we add a MouseListener and a MouseMoveListener on our button.
* On the MouseListener, we change the mouseDown flag on the mouseDown and mouseUp methods.
* On the MouseMoveListener, we change the mouseOver flag on the mouseMove method.
*/
if ( mouseDown && mouseOver ) {
textX++;
textY++;
}
// Draw the new text.
event.gc.drawText( getText(), textX, textY );
// If button has focus, draw the dotted border on it.
if ( isFocusControl() ) {
int[] dashes = { 1, 1 };
evento.gc.setLineDash( dashes );
evento.gc.drawRectangle( 3, 3, buttonWidth - 8, buttonHeight - 8 );
}
}
答案 1 :(得分:0)
最后,我决定将它作为一个带有复选框/单选按钮和标签的自定义Composite实现。不理想,但我必须做。