SWT / WindowBuilder中的多行按钮文本?

时间:2010-12-28 15:42:34

标签: java eclipse swt windowbuilder

有没有办法强制SWT按钮文本跨越两行,在SWT代码中手动或使用WindowBuilder GUI? 我有这个: alt text

我想要这样的东西(数字改变的图像来实现这一点): alt text

有可能吗?怎么样?

6 个答案:

答案 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'被忽略)没设置)。

认为这可能有用。

enter image description here

答案 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;
    }
}

enter image description here

答案 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()我无法理清,但这可能会指向正确的方向。