2010-12-28 3 views
3

Есть ли способ заставить текст кнопки SWT охватывать две строки, либо вручную в SWT-коде, либо используя GUI WindowBuilder? у меня есть это: alt textМногострочный текст в SWT/WindowBuilder?

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

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

+1

http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg17423.html Попробуйте установить его с изображением, хотя его не рекомендуется делать –

+0

ответ ниже по Monikka пропускания ' SWT.WRAP' как стиль кнопки решает проблему для меня. например 'new Button (parent, SWT.WRAP | SWT.PUSH)' – tkokasih

ответ

0

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

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

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

Вы можете получить ручку с помощью btn.handle. С немного ЮНОЙ волшебного что-то вдоль этих линий может быть возможными:

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(), который я не мог разобраться), но это может указывать вы в правильном направлении.

+0

Это не конец света для меня в текущем проекте, чтобы выполнить это, и, зная недостатки, которые участвуют в выполнении задачи, я воздержусь от попытки. Спасибо за информацию! – Zoot

+0

Наверное, я немного переборщил. Мне кажется, что этот подход - единственный способ сделать это, используя чистый SWT. –

+0

Это не сработает. SWT использует уже эту функцию 'SetWindowText()'. Windows удаляет все символы после первого NL, а не SWT. То есть, если вы не установили флаг стиля ES_MULTILINE. См. Мой ответ для полного кода Java. – andi

1

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

+3

Внимательно прочитайте javadoc для виджета кнопки swt. Для 'setText()' ясно сказано, что: 'Этот метод устанавливает метку кнопки. Метка может включать мнемонический символ, но не должна содержать разделителей строк. – Favonius

+2

Вышеуказанный комментарий верен. Похоже, что в настоящее время это невозможно сделать в SWT. Возможны варианты использования изображения или использования неместного элемента управления. Например, в SWT можно встроить элементы управления Swing. Конечно, я бы очень тщательно подумал, действительно ли это стоит того. –

4

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

1

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

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

много компонентов поворота визуализируют HTML.

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

+0

Обратите внимание, что речь идет о SWT, а не о Swing. –

+0

Ах. Я пропустил это. Извиняюсь. – EricR

4

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

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 и это все. Конечно, этот класс и внутренняя кнопка дескриптора не являются частью SWT API, поэтому ваш код больше не переносится. Но функции определены в Windows API, поэтому вам не нужно слишком беспокоиться, они будут меняться в будущих версиях SWT.

Помните, что после этого изменения computeSize() перестает работать хорошо.


Edit: полный класс, где я забочусь о 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

+0

Я реализовал это только для \ n как разделитель строк. Если вы хотите использовать \ r \ n, обновите код для преобразования в одиночный в computeSize. – andi

6

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

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

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

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

enter image description here

+0

Это лучше, чем мое решение с GWL_STYLE. Но вам все равно нужно перезаписать computeSize(). Я обновил свой код, чтобы использовать SWT.WRAP. – andi

Смежные вопросы