Frage

Ich schreibe eine App und unsere Designer wollen auf ein paar unserer Composites für einige der Hintergründe Gradienten verwenden.

Ich schrieb den folgenden Code:

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

        }
    });

Dies zieht den Gradienten fein auf dem zusammengesetzten, aber wir haben Etikett / CLabels, Blachen und Verbindungen auf der Oberseite des Verbunds.

In diesen Bereichen ist der Hintergrund nur die schlichte grauen erhalten Sie, wenn Sie eine leere Leinwand zeichnen.

Ich habe versucht, die Labels zwingt den Hintergrund wie so zu erben:

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

Aber das läßt mich mit der gleichen Standard grau und ohne Steigung hinter den Komponenten auf der Oberseite des Verbunds.

Irgendwelche Vorschläge für den Gradienten immer der Hintergrund jedes Elements sein?

Ich würde nicht mit einem Bild zu zeichnen, die Steigung auf einen gc entgegengesetzt wird geliefert und dann auf dieses Bild die Hintergrundeinstellung. Jedoch nur das Verfahren ist überhaupt nicht arbeitet, Composite oder einem seiner Elemente.

Auch ist es mir nicht möglich, die Steigung individuell meines Wissens einzustellen. Wir wollen, dass die ganze Verbund eines einheitlichen fließende Gradienten zu sein.

[Bearbeiten] Ich lud ein Beispiel bis zu twitpic hier .

Danke,

Brian Gianforcaro

War es hilfreich?

Lösung

Mit composite.setBackgroundMode (SWT.INHERIT_DEFAULT) , aber nicht den Composite malen direkt - malen ein Bild und legen Sie es als Hintergrundbild mit composite.setBackgroundImage (Bild) . Es sei denn, ich bin ein Trick fehlt, das heißt, Sie müssen nur das Bild regenerieren, wenn der Verbund zu der Größe verändert wird.

Es soll möglich sein, diesen Code zu cut and paste wie um zu sehen, was ich meine:

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

}

Andere Tipps

Das erste, was ich versuchen würde, ist auf

scroll top