Как сделать так, чтобы метка наследовала GC композита в SWT

Я пишу приложение, и наши дизайнеры хотят использовать градиенты для некоторых фонов в нескольких наших композициях.

Я написал следующий код:

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

        }
    });

Это отлично отрисовывает градиент на композите, но у нас есть Label/CLabels, Canvases и Links поверх композита.

В этих областях фон просто серый, как при рисовании пустого холста.

Я попытался заставить ярлыки наследовать фон следующим образом:

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

Но это оставляет меня с тем же серым цветом по умолчанию и без градиента за компонентами поверх композита.

Любые предложения по использованию градиента в качестве фона для каждого элемента?

Я был бы не против нарисовать градиент на gc с предоставленным изображением, а затем установить фон для этого изображения. Однако этот метод просто не работал вообще, составной или какой-либо из его элементов.

Кроме того, насколько мне известно, я не могу установить градиент индивидуально. Мы хотим, чтобы вся композиция была одним равномерным плавным градиентом.

[edit] Я загрузил пример на twitpic здесь.

Спасибо,

Брайан Джанфоркаро


person Brian Gianforcaro    schedule 25.09.2008    source источник


Ответы (2)


Используйте composite.setBackgroundMode(SWT.INHERIT_DEFAULT), но не рисуйте композит напрямую — рисуйте изображение и устанавливайте его в качестве фонового с помощью composite.setBackgroundImage(Image). Если я не упустил какой-то трюк, это означает, что вам нужно регенерировать изображение только тогда, когда изменяется размер композита.

Вы должны иметь возможность вырезать и вставлять этот код, чтобы понять, что я имею в виду:

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

}
person McDowell    schedule 26.09.2008
comment
С небольшими изменениями и подталкиваниями это сработало чудесно. Благодарю вас! - person Brian Gianforcaro; 27.09.2008
comment
Нет необходимости устанавливать фоновое изображение. Настройка цвета тоже отлично работает для меня. - person Mot; 08.06.2011

person    schedule
comment
Это была хорошая идея, но она опирается на фактический gc элемента управления, поэтому любой текст или что-либо в элементе управления будет уничтожено. - person Brian Gianforcaro; 27.09.2008