2010-07-22 20 views
7

En este momento estoy tratando de cambiar el color de fondo de un org.eclipse.swt.widgets.Button con el siguiente código:org.eclipse.swt.widgets Cambio de color de fondo en Windows

 
    Button sceneButton = new Button(border, SWT.TOGGLE | SWT.FLAT); 
    sceneButton.setBackground(Color.RED); 

Estos trabajos bien cuando ejecuto el programa en Solaris, pero no hago nada cuando ejecuto el código en Windows. es posible? Si no, ¿hay algún tipo de solución alternativa que me permita cambiar el color de fondo (incluso si el "color" es una imagen) mientras sigo mostrando texto en el botón? ¡Gracias!

Respuesta

5

No puede. En la documentación del método Control.setBackground(), se menciona:

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

+0

Lo leí antes de publicarlo y me di cuenta de que probablemente era imposible. Me preguntaba si alguien ha tenido este problema/ha surgido algún tipo de solución, incluso si dicha solución es increíblemente hacky. –

+2

Tal vez una etiqueta con una imagen de un botón de color con el color que desee. Y una imagen extra cuando 'haces clic' en el botón. –

+0

Simplemente optamos por colocar una Imagen de Fondo en el botón, que coloreó el área entre el botón y el borde del botón. Alternativamente, podríamos haber usado el Puente SWT_AWT e integrado los botones SWT en la GUI, pero eso habría sido demasiado complicado y habría tomado demasiado tiempo. ¡Gracias! –

4

El fondo de un botón en Windows se establece desde fuera del SWT.

Haga clic con el botón derecho en su escritorio, haga clic en Propiedades.

Vaya a la pestaña "Apariencia".

Haga clic en "Avanzado".

Creo que "objetos 3D" determina el fondo del botón. Esto está determinado por el tema de cada usuario.

alt text

Una gran cosa sobre SWT es que utiliza los widgets de subyacentes del sistema y temas. Una cosa frustrante sobre SWT es que utiliza los widgets y temas subyacentes del sistema.

+0

Desafortunadamente, este programa se ejecuta en Solaris y Windows, y los comportamientos deben ser lo más similares posible. –

+0

Una cantidad frustrantemente grande de color de Windows está controlada por el tema del sistema. Te deseo suerte con tu proyecto. – Zoot

12

En los sistemas operativos Windows button.setBackGround no funciona directamente. Un pequeño fragmento de código puede ayudar. Anular el evento de dibujo del botón como se muestra a continuación: -

----- obj es el nombre del botón de abajo fragmento ------------

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); 
    } 
}); 
+0

También establezco el color de mi Combo de solo lectura en blanco por cierto.Pero cuando no configuro el fondo como color negro, el rectángulo cubre el Combo (no puede ver el texto). ¿Cómo puedo configurar el color para Combo sin cambiar el color de fondo? Gracias –

1

Puede simular una botón usando CLabel. Agregue un mouselistener para cambiar el fondo con el mouse hacia abajo y el mouse hacia arriba y, en el evento del mouse hacia arriba, despache un evento listener de selección para que se comporte igual que un botón. Por ejemplo: cambia

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); 
    } 
}); 

Este brevemente los antecedentes del botón mientras pulsa el ratón para dar el efecto de hacer clic en un botón. CLabel también se puede extender, a diferencia de otros widgets SWT, por lo que puede crear una subclase si necesita hacer esto con frecuencia.

Cuestiones relacionadas