2

SWT は、ボタンでの「画像上のテキスト」をサポートしていません。Image が設定されている場合、テキストを非表示にします。これを達成するための最良のアプローチは何ですか?

私が考えることができる最善の回避策は、テキストを画像と「マージ」することでした...これを行う優れたJavaライブラリを知っている人はいますか?

注: 画像の上にテキストを描画するだけのカスタム実装を見つけました: https://github.com/jrobichaux/SquareButton/wiki。これがSWTに実装されていないのはなぜですか?? (とにかく、私はこのクラスを機能させることができませんでした...そして私はNATIVEボタンの外観が欲しいので、私は本当にこのアプローチを望んでいません)

4

1 に答える 1

5

これが SWT に実装されていないのはなぜですか?

SWT はネイティブに見えることを目指しています。これを実現するために、SWT はウィジェットに OS リソースを使用します。したがって、SWTButtonは OS ボタンのように見えます。画像の上または下にテキストがあるボタンはあまり一般的ではありません。

私は何とかうまくいくものを達成することができましたが、それはかなりハッキーです。多分あなたはそれを出発点として使うことができます:

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(1, false));

    final Image image = display.getSystemImage(SWT.ICON_ERROR);
    final String text = "Button";

    final Button button = new Button(shell, SWT.PUSH);

    GridData data = new GridData();
    float fontHeight = shell.getFont().getFontData()[0].height;
    data.heightHint = image.getImageData().height + (int)fontHeight + 20;
    data.widthHint = 100;

    button.setLayoutData(data);

    button.addListener(SWT.Paint, new Listener() {

        @Override
        public void handleEvent(Event event) {
            GC gc = event.gc;

            int width = ((GridData)button.getLayoutData()).widthHint;
            int height = ((GridData)button.getLayoutData()).heightHint;
            Point textSize = gc.textExtent(text);

            gc.drawText(text, width / 2 - textSize.x / 2, image.getImageData().height - image.getImageData().height / 2 - textSize.y, true);
            gc.drawImage(image, width / 2 - image.getImageData().width / 2, height / 2 - image.getImageData().height / 2 + textSize.y / 2);
        }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    image.dispose();
    display.dispose();
}

ご覧のとおりGridData、ボタンのサイズ変更と、ボタンを画像とテキストで埋めるためにListenerforを使用していました。SWT.Paint

結果は次のようになります。

ここに画像の説明を入力

于 2012-10-11T09:43:09.367 に答える