Следующий код делает трюк:
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;
}
}
http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg17423.html Попробуйте установить его с изображением, хотя его не рекомендуется делать –
ответ ниже по Monikka пропускания ' SWT.WRAP' как стиль кнопки решает проблему для меня. например 'new Button (parent, SWT.WRAP | SWT.PUSH)' – tkokasih