有没有办法强制SWT按钮文本跨越两行,在SWT代码中手动或使用WindowBuilder GUI? 我有这个:
我想要这样的东西(数字改变的图像来实现这一点):
有可能吗?怎么样?
答案 0 :(得分:7)
我能够通过添加 SWT.WRAP 作为按钮的样式并在文本中插入'\ n'来设置为多行按钮文本。按钮标签。
....
Button check = new Button(composite, SWT.WRAP | SWT.PUSH );
check.setText("Multi\n Line\n Button \n Text");
....
即使button.setText(..)java doc说按钮标签不能包含新的行标记,当SWT.WRAP作为样式添加时它也有效(当SWT.WRAP被忽略时,'\ n'被忽略)没设置)。
认为这可能有用。
答案 1 :(得分:4)
我不是潜入本机代码,而是通过创建自定义控件来实现。扩展合成,为多行文本使用标签,并使用2D绘图添加一些装饰。在图形上下文中有圆角矩形和渐变绘画的方法。它可能看起来不像本机小部件,但在我看来,比使用JNI更好。
答案 2 :(得分: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()不再有效。
编辑:全班,我负责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;
}
}
答案 3 :(得分:1)
我会尝试将按钮文本设置为一个字符串,其中包含'\ n'字符,您希望换行符发生。
答案 4 :(得分:1)
在 swing 中实际上是一种非常简单的方法,而不是在SWT中。当我第一次发布这个答案时,我误解了这个问题,但是因为我在寻找摆动解决方案时找到了自己的方式,所以我会把它留给其他人。
button.setText("<html>My<br>Text<br>");
许多swing组件呈现HTML。
在检查发布日期时,不确定这是否是旧问题的相关答案,但我在尝试解决此问题时发现了这一点,所以我想我会分享。欢呼声。
答案 5 :(得分:0)
我能想到的唯一方法就是通过JNI / JNA。请注意,如果你走这条路,你将通过调用特定于平台的本机函数来破坏Java的平台独立性。
对于Windows,请查看SetWindowText API call。假设您的代码类似于:
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()
我无法理清,但这可能会指向正确的方向。