Domanda

Sto scrivendo un'app e i nostri progettisti vogliono utilizzare i gradienti per alcuni sfondi su alcuni dei nostri compositi.

Ho scritto il seguente codice:

composite.addListener (SWT.Paint, new Listener () {
    public void handleEvent (Event e) {
            GC gc = e.gc;
            Rectangle rect = composite.getClientArea ();
            Color color1 = new Color (display, 0, 0, 0);
            Color color2 = new Color (display, 255, 255, 255);
            gc.setForeground(color1);
            gc.setBackground(color2);
            gc.fillGradientRectangle (rect.x, rect.y, rect.width, rect.height , true);

        }
    });

Questo disegna la sfumatura fine sul composito, ma abbiamo Etichetta / CLabels, Canvas e collegamenti sulla parte superiore del composito.

In queste aree, lo sfondo è solo il semplice grigio che ottieni quando disegni una tela vuota.

Ho provato a forzare le etichette a ereditare lo sfondo in questo modo:

label.setBackgroundMode(SWT.INHERIT_DEFAULT) //SWT.INHERIT_FORCE Doesn't work either

Ma questo mi lascia con lo stesso grigio predefinito e nessuna sfumatura dietro i componenti in cima al Composito.

Qualche suggerimento per ottenere il gradiente come sfondo di ogni elemento?

Non sarei contrario a disegnare il gradiente su un gc con un'immagine fornita e quindi a impostare lo sfondo su quell'immagine. Tuttavia quel metodo non ha funzionato affatto, composito o nessuno dei suoi elementi.

Inoltre non è possibile per me impostare il gradiente individualmente a mia conoscenza. Vogliamo che l'intero composito sia un gradiente scorrevole uniforme.

[modifica] Ho caricato un esempio fino a twitpic qui .

Grazie,

Brian Gianforcaro

È stato utile?

Soluzione

Usa composite.setBackgroundMode (SWT.INHERIT_DEFAULT) , ma non dipingere direttamente il composito: dipingi un'immagine e impostala come immagine di sfondo usando composite.setBackgroundImage (Immagine) . A meno che non mi manchi un trucco, questo significa che devi solo rigenerare l'immagine quando anche il composito viene ridimensionato.

Dovresti essere in grado di tagliare questo codice così com'è per vedere cosa intendo:

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
 * SWT composite with transparent label
 * 
 * @author McDowell
 */
public class Sweet {

    private Image imageGradient;
    private Label label;
    private Composite composite;

    private void createComponents(Shell parent) {
        composite = new Composite(parent, SWT.NONE);
        composite.addListener(SWT.Resize, new Listener() {
            public void handleEvent(Event e) {
                changeImage();
            }
        });
        composite.setLayout(new FormLayout());
        composite.setBackgroundMode(SWT.INHERIT_DEFAULT);

        label = new Label(composite, SWT.None);
        label.setText("Hello, World!");
    }

    private void changeImage() {
        Image oldImage = imageGradient;

        Display display = composite.getDisplay();
        Rectangle rect = composite.getClientArea();
        imageGradient = new Image(display, rect.width, rect.height);
        GC gc = new GC(imageGradient);
        try {
            Color color1 = new Color(display, 200, 200, 255);
            try {
                Color color2 = new Color(display, 255, 255, 255);
                try {
                    gc.setForeground(color1);
                    gc.setBackground(color2);
                    gc.fillGradientRectangle(rect.x, rect.y, rect.width,
                            rect.height, true);
                } finally {
                    color2.dispose();
                }
            } finally {
                color1.dispose();
            }
        } finally {
            gc.dispose();
        }
        composite.setBackgroundImage(imageGradient);

        if (oldImage != null) {
            oldImage.dispose();
        }
    }

    private void openShell(Display display) {
        Shell shell = new Shell(display);
        try {
            shell.setSize(200, 100);
            shell.setLayout(new FillLayout());
            createComponents(shell);
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
        } finally {
            if (!shell.isDisposed()) {
                shell.dispose();
            }
        }
    }

    public void run() {
        Display display = Display.getDefault();
        try {
            openShell(display);
        } finally {
            display.dispose();
        }
    }

    public void dispose() {
        if (imageGradient != null) {
            imageGradient.dispose();
        }
    }

    public static void main(String[] args) {
        Sweet sweet = new Sweet();
        try {
            sweet.run();
        } finally {
            sweet.dispose();
        }
    }

}

Altri suggerimenti

La prima cosa che vorrei provare è cattura un'immagine dal widget e colora la parte dell'immagine in cui si trova il widget figlio direttamente sul widget figlio.

Se non funziona, prova a utilizzare lo stesso listener di colori per entrambi i widget, ma prima di impostare la trasformazione del GC su dopo aver trasformato il GC per tradurre le coordinate nello spazio delle coordinate dell'etichetta:

Listener listener = new Listener () {
  public void handleEvent (Event e) {
    GC gc = e.gc;
    Rectangle rect = composite.getClientArea ();
    Point offset = ((Control)e.widget).toControl(composite.toDisplay(0, 0));
    Color color1 = new Color (display, 0, 0, 0);
    Color color2 = new Color (display, 255, 255, 255);
    gc.setForeground(color1);
    gc.setBackground(color2);
    gc.fillGradientRectangle (rect.x + offset.x, rect.y + offset.y,
        rect.width, rect.height , true);
  }
}
composite.addListener (SWT.Paint, listener);
label.addListener(SWT.Paint, listener);

Inoltre, fai attenzione a smaltire tutte le istanze di colore che crei dopo aver finito con esse. Altrimenti perderai risorse di sistema e alla fine finirai.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top