Многострочный текст кнопки в SWT / WindowBuilder? - PullRequest
3 голосов
/ 28 декабря 2010

Есть ли способ заставить текст кнопки SWT занимать две строки, либо вручную в коде SWT, либо с помощью графического интерфейса пользователя WindowBuilder? У меня есть это: alt text

Я хочу что-то вроде этого (цифровое изображение для этого): alt text

Возможно ли это? Как?

Ответы [ 6 ]

7 голосов
/ 21 февраля 2014

Мне удалось получить текст многострочной кнопки, добавив SWT.WRAP в качестве стиля для кнопки и вставив '\ n' в текст, который будет установлен в качестве кнопки этикетка.

....
Button check = new Button(composite, SWT.WRAP | SWT.PUSH );
check.setText("Multi\n Line\n Button \n Text");
....

Несмотря на то, что Java-документ button.setText (..) говорит, что метка кнопки не должна содержать символы новой строки, она работает, когда SWT.WRAP добавляется как стиль ('\ n' игнорировалось, когда SWT.WRAP был не установлено).

Просто подумал, что это может быть полезно.

enter image description here

4 голосов
/ 13 марта 2013

Следующий код делает трюк:

final int style = OS.GetWindowLong(button.handle, OS.GWL_STYLE);
OS.SetWindowLong(button.handle, OS.GWL_STYLE, style | OS.BS_MULTILINE);
button.setText("line 1\nline 2");

Вы просто импортируете org.eclipse.swt.internal.win32.OS и все. Конечно, этот класс и поле handle внутри кнопки не являются частью SWT API, поэтому ваш код больше не является переносимым. Но функции определены в Windows API, поэтому вам не нужно слишком беспокоиться, они изменятся в будущих версиях SWT.

Имейте в виду, что после этого изменения computeSize () больше не работает.


Редактировать: полный класс, где я забочусь о computeSize () и стиле GWL

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;


public class MultilineButton extends Button {

    public MultilineButton(Composite parent, int style) {
        super(parent, style);
        final int gwlStyle = OS.GetWindowLong(this.handle, OS.GWL_STYLE);
        OS.SetWindowLong(this.handle, OS.GWL_STYLE, gwlStyle | OS.BS_MULTILINE);
    }

    @Override
    protected void checkSubclass() {
    }

    @Override
    public Point computeSize(int wHint, int hHint, boolean changed) {
        final Point size = super.computeSize(wHint, hHint, changed);
        final GC gc = new GC(this);

        final String multiLineText = this.getText();
        final Point multiLineTextSize = gc.textExtent(multiLineText, SWT.DRAW_DELIMITER);

        final String flatText = multiLineText.replace('\n', ' ');
        final Point flatTextSize = gc.textExtent(flatText);

        gc.dispose();

        size.x -= flatTextSize.x - multiLineTextSize.x;
        size.y += multiLineTextSize.y - flatTextSize.y;

        return size;
    }
}

enter image description here

4 голосов
/ 31 декабря 2010

Вместо погружения в нативный код, я бы сделал это, создав собственный элемент управления.Расширьте составное, используйте метку для многострочного текста и добавьте некоторые украшения с помощью 2D-рисунка.В графическом контексте есть методы для скругленных прямоугольников и рисования градиентом.Он может выглядеть не совсем как родной виджет, но, на мой взгляд, лучше, чем использование JNI.

1 голос
/ 12 декабря 2011

на самом деле супер простой способ в swing , а не в SWT. Я неправильно прочитал вопрос, когда впервые опубликовал этот ответ, но так как я нашел свой путь здесь, пока искал свинг-решение, я оставлю его для других.

button.setText("<html>My<br>Text<br>");

многие компоненты Swing отображают HTML.

Проверяя дату публикации, не уверен, является ли это актуальным ответом на старый вопрос, но я нашел это, пытаясь решить эту проблему, поэтому решил поделиться. Приветствия.

1 голос
/ 28 декабря 2010

Я бы попробовал установить текст кнопки в строку с символом '\ n', где вы хотите, чтобы произошел разрыв строки.

0 голосов
/ 30 декабря 2010

Единственный способ, которым я могу думать об этом, - через JNI / JNA. Обратите внимание, что если вы пойдете по этому пути, вы нарушите независимость платформы Java, вызвав специфичные для платформы собственные функции.

Для Windows взгляните на вызов API SetWindowText . Предположим, у вас есть код, похожий на:

Button btn = new Button(shell, SWT.PUSH);
btn.setText("Hello world!");

Вы можете получить дескриптор через btn.handle. С небольшим количеством волшебства JNA возможно что-то вроде этого:

final User32 lib = (User32) Native.loadLibrary("user32", User32.class);
final HWND hWnd = new W32API.HWND(new W32API.UINT_PTR(btn.handle)
        .toPointer());
final String text = "Hello\nworld!"; // or "Hello\r\nworld!"?
lib.SetWindowText(hWnd, text.toCharArray());

На самом деле я не мог заставить это работать (это дает java.lang.UnsatisfiedLinkError на SetWindowText(), который я не мог разобрать), но это могло бы указать вам правильное направление.

...