3

有没有办法强制 SWT 按钮文本跨越两行,无论是在 SWT 代码中手动还是使用 WindowBuilder GUI?我有这个: 替代文字

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

是否可以?如何?

4

6 回答 6

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 文档说按钮标签不能包含换行符,但它在 SWT.WRAP 作为样式添加时有效(未设置 SWT.WRAP 时忽略'\n') .

只是觉得这可能有用。

在此处输入图像描述

于 2014-02-21T13:15:33.483 回答
4

我不会深入研究本机代码,而是通过创建自定义控件来做到这一点。扩展复合,为多行文本使用标签,并使用 2D 绘图添加一些装饰。在图形上下文中有用于圆角矩形和渐变绘制的方法。它可能看起来不像原生小部件,但在我看来,它比使用 JNI 更好。

于 2010-12-31T03:19:24.057 回答
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;
    }
}

在此处输入图像描述

于 2013-03-13T11:59:08.667 回答
1

我会尝试将按钮文本设置为带有 '\n' 字符的字符串,您希望在其中发生换行符。

于 2010-12-28T17:44:05.803 回答
1

在swing中实际上有一个超级简单的方法,而不是在 SWT 中。当我第一次发布这个答案时,我误读了这个问题,但由于我在寻找挥杆解决方案时找到了我的方式,所以我会把它留给其他人。

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

许多 Swing 组件呈现 HTML。

在检查发布日期时,不确定这是否是一个老问题的相关答案,但我在尝试解决这个问题时发现了这个,所以我想我会分享。干杯。

于 2011-12-12T17:55:23.167 回答
0

我能想到的唯一方法是通过 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.UnsatisfiedLinkErrorSetWindowText()无法解决的问题),但这可能会为您指明正确的方向。

于 2010-12-30T16:27:04.883 回答