有没有办法强制 SWT 按钮文本跨越两行,无论是在 SWT 代码中手动还是使用 WindowBuilder GUI?我有这个:
我想要这样的东西(数字改变的图像来实现这一点):
是否可以?如何?
有没有办法强制 SWT 按钮文本跨越两行,无论是在 SWT 代码中手动还是使用 WindowBuilder GUI?我有这个:
我想要这样的东西(数字改变的图像来实现这一点):
是否可以?如何?
通过添加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 时忽略'\n') .
只是觉得这可能有用。
我不会深入研究本机代码,而是通过创建自定义控件来做到这一点。扩展复合,为多行文本使用标签,并使用 2D 绘图添加一些装饰。在图形上下文中有用于圆角矩形和渐变绘制的方法。它可能看起来不像原生小部件,但在我看来,它比使用 JNI 更好。
以下代码可以解决问题:
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() 不再正常工作。
编辑:我负责 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;
}
}
我会尝试将按钮文本设置为带有 '\n' 字符的字符串,您希望在其中发生换行符。
在swing中实际上有一个超级简单的方法,而不是在 SWT 中。当我第一次发布这个答案时,我误读了这个问题,但由于我在寻找挥杆解决方案时找到了我的方式,所以我会把它留给其他人。
button.setText("<html>My<br>Text<br>");
许多 Swing 组件呈现 HTML。
在检查发布日期时,不确定这是否是一个老问题的相关答案,但我在尝试解决这个问题时发现了这个,所以我想我会分享。干杯。
我能想到的唯一方法是通过 JNI/JNA。请注意,如果您走这条路,您将通过调用特定于平台的本机函数来破坏 Java 的平台独立性。
对于 Windows,请查看SetWindowText API 调用。假设您的代码类似于:
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()
无法解决的问题),但这可能会为您指明正确的方向。