SWTリンクがグラデーション背景でちらつく
-
03-07-2019 - |
質問
SWTインターフェイスを使用するEclipseプラグインを開発しています。テキストを表示する必要があり、そのテキスト内にリンクが必要です。クリック可能なリンクをテキストに含めることができるウィジェットは、LinkとBrowserの2つだけです。ただし、ブラウザは私のニーズには過剰すぎるため、外観を適切にカスタマイズできませんでした。これにより、リンクウィジェットのみが残ります。
問題は、リンクウィジェットが含まれているコンポジットからグラデーションを継承する必要があることです。これは、リンクコンポーネントがちらつき、サイズ変更またはスクロールされた場合にのみ正しく行われます。リンクは、私がこの効果を見た唯一のコンポーネントです。
これを修正するために、他のコンポーネントを操作してクリック可能なリンクを作成しようとしましたが、まだ良い解決策が見つかりませんでした。
リンクのちらつき効果を修正する方法はありますか、リンクをサポートする別のコンポーネントがありますか?
ありがとう、
ブライアン
解決
これに取り組んで一日を過ごした後、私は回避策を思いつきました。テキスト領域のコンポジットを作成しました。 URLの一部ではない単語ごとに、独自のラベルを取得します。リンクについては、各文字に独自のラベルが付けられました。次に、URL文字のラベルは、ブラウザーを起動するリスナーを取得しました。このメソッドを使用すると、リンク機能が提供され、サイズ変更が適切に処理され、ちらつきがなくなりました。
他のヒント
SWT.NO_BACKGROUNDをLinkウィジェットに渡そうとしましたか?それは少し奇妙になるかもしれません...そしてあなたは適切にGUI描画を得るためにもう少し作業をしなければならないかもしれませんが、それは私の最初の推測でしょう。
それ以外は、StyledText内のリンクのQuick n 'dirty実装です。カーソルを変更する場合(必要な場合)に入力する必要があります。また、「リンクするテキスト」を作成する必要があります。マッピングスキーム。
唯一のことは、StyledTextがあなたの背景を継承するかどうかわからないということです...それを試してみてください。
public class StyledTextExample {
public static void main(String [] args) {
// create the widget's shell
Shell shell = new Shell();
shell.setLayout(new FillLayout());
shell.setSize(200, 100);
Display display = shell.getDisplay();
// create the styled text widget
final StyledText widget = new StyledText(shell, SWT.NONE);
String text = "This is the StyledText widget.";
widget.setText(text);
widget.setEditable(false);
final StyleRange hyperlinkStyle = new StyleRange();
String linkWord = "StyledText";
hyperlinkStyle.start = text.indexOf(linkWord);
hyperlinkStyle.length = linkWord.length();
hyperlinkStyle.fontStyle = SWT.BOLD;
hyperlinkStyle.foreground = display.getSystemColor(SWT.COLOR_BLUE);
widget.setStyleRange(hyperlinkStyle);
widget.addMouseListener(new MouseAdapter() {
public void mouseUp(MouseEvent arg0) {
Point clickPoint = new Point(arg0.x, arg0.y);
try {
int offset = widget.getOffsetAtLocation(clickPoint);
if (widget.getStyleRangeAtOffset(offset) != null) {
System.out.println("link");
}
} catch (IllegalArgumentException e) {
//ignore, clicked out of text range.
}
}});
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch()) display.sleep();
}
}