开发者

Changing org.eclipse.swt.widgets background color in Windows

Right now I am trying to change the background color of a org.eclipse.swt.widgets.Button with the following code:

    Button sceneButton = new Button(border, SWT.TOGGLE | SWT.FLAT);  
    sceneButton.setBackground(Co开发者_运维百科lor.RED);

This works fine when I run the program in Solaris, but does nothing when I run the code in Windows. Is this possible? If not, is there some kind of workaround that would allow me to change the background color (even if the "color" is an image) while still displaying text in the button? Thanks!


On windows operating systems button.setBackGround doesn't work directly. A small snippet of code can help. Override the paint event of button as shown below:-

-----obj is button name in below snippet------------

obj.addPaintListener(new PaintListener() {
@Override
    public void paintControl(PaintEvent arg0) {
    // TODO Auto-generated method stub
    obj.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
    org.eclipse.swt.graphics.Pattern pattern;
    pattern = new org.eclipse.swt.graphics.Pattern(arg0.gc.getDevice(), 0,0,0,100, arg0.gc.getDevice().getSystemColor(SWT.COLOR_GRAY),230, arg0.gc.getDevice().getSystemColor(SWT.COLOR_BLACK),230);
    arg0.gc.setBackgroundPattern(pattern);
    arg0.gc.fillGradientRectangle(0, 0, obj.getBounds().width, obj.getBounds().height, true);
    }
});


You can't. In the documentation of method Control.setBackground(), it is mentioned:

For example, on Windows the background of a Button cannot be changed.


The background of a button in Windows is set from outside of SWT.

Right-click your desktop, click Properties.

Go to the "Appearance" tab.

Click "Advanced".

I believe "3D objects" determines the button background. This is determined by each user's theme.

Changing org.eclipse.swt.widgets background color in Windows

One great thing about SWT is it uses the underlying system widgets and themes. A frustrating thing about SWT is it uses the underlying system widgets and themes.


You can simulate a button using CLabel. Add a mouselistener to change the background on mouse down and mouse up, and in the mouse up event dispatch a selection listener event so that it behaves the same as a button. For example:

Color bg = ...
Color shadow = ...
CLabel simulatedButton = new CLabel(parent, SWT.PUSH);
simulatedButton.setBackground(bg); 
simulatedButton.addMouseListener(new MouseAdapter() {

  @Override
  public void mouseUp(MouseEvent e) {
    simulatedButton.setBackground(bg);
    notifyListeners(SWT.Selection, new Event());
  }

  @Override
  public void mouseDown(MouseEvent e) {
    simulatedButton.setBackground(shadow);
  }
});

This briefly changes the background of the button while you are pressing the mouse to give the effect of clicking a button. CLabel can also be extended, unlike other SWT widgets, so you can create a subclass if you need to do this often.


No You cannot change the Background of a Button is SWT. You can find this information in Eclipse SWT documentation.

Eclipse SWT Documentation Button

public void setBackground(Color color)

Sets the receiver's background color to the color specified by the argument, or to the default system color for the control if the argument is null.

Note: This operation is a hint and may be overridden by the platform. For example, on Windows the background of a Button cannot be changed.


Could it be that the last change in SWT for Windows has changed this? I left the RED background in the code and I have changed the SWT library to the latest and now the background color is changing.


btnNewButton.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));

You can change the background color for a button in SWT for windows with the above code. Few prerequisites should be to:

  • Use these two SWT jars :org.eclipse.swt.win32.win32.x86_64_3.109.0.v20181204-1801.jar and org.eclipse.swt_3.109.0.v20181204-1801.jar. (109 version)
  • Import org.eclipse.wb.swt.SWTResourceManager You can also try latest versions of jars but it worked for me with this. Usually, you can go to advanced properties panel in windows builder to set background but it does not reflect color at runtime.With this, that problem should go away.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜