SWT コードで手動で、または WindowBuilder GUI を使用して、SWT ボタンのテキストを強制的に 2 行にまたがらせる方法はありますか? 私はこれを持っています:
私はこのようなものが欲しいです(これを達成するためにデジタル的に変更された画像):
出来ますか?どのように?
SWT コードで手動で、または WindowBuilder GUI を使用して、SWT ボタンのテキストを強制的に 2 行にまたがらせる方法はありますか? 私はこれを持っています:
私はこのようなものが欲しいです(これを達成するためにデジタル的に変更された画像):
出来ますか?どのように?
ボタンのスタイルとして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' は無視されました)。 .
これは役に立つかもしれないと思っただけです。
ネイティブ コードに飛び込む代わりに、カスタム コントロールを作成してこれを行います。コンポジットを拡張し、複数行のテキストにラベルを使用し、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;
}
}
実際、SWT ではなく、swingで非常に簡単な方法があります。この回答を最初に投稿したときに質問を読み違えましたが、スイングの解決策を探しているときにここにたどり着いたので、他の人に任せます。
button.setText("<html>My<br>Text<br>");
多くの Swing コンポーネントは HTML をレンダリングします。
投稿日を確認したところ、これが古い質問に対する適切な回答であるかどうかはわかりませんが、この問題を解決しようとしているときにこれを見つけたので、共有したいと思いました. 乾杯。
ボタンのテキストを、改行を発生させたい場所に「\ n」文字を含む文字列に設定してみます。
これを行う唯一の方法は、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()
ます) が、これはあなたを正しい方向に向けるかもしれません.