0
SWT Text
には、フィールドの目的を示すメッセージをヒントとして表示するために使用できるsetMessage()
というメソッドがあります。SWT StyledTextにヒントメッセージを表示する方法
StyledText
にはsetMessage()
の方法がないようです。それにもかかわらず、StyledText
で同様のことを行うことはできますか?
SWT Text
には、フィールドの目的を示すメッセージをヒントとして表示するために使用できるsetMessage()
というメソッドがあります。SWT StyledTextにヒントメッセージを表示する方法
StyledText
にはsetMessage()
の方法がないようです。それにもかかわらず、StyledText
で同様のことを行うことはできますか?
最近、私はStyledText内にヒントを表示する必要がありました。したがって私はここで私の解決策を共有します。
StyledTextMessage
のsetMessage()
メソッドは、StyledText
ウィジェットにヒントを表示するために使用できます。このクラスでは、メッセージテキストを描画するためのペイントリスナと、無効化される可能性があるときはいつでもメッセージを再描画するための複数のリスナとフィルタを追加します。
public class StyledTextMessage {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
StyledText styledText2 = new StyledText(shell, SWT.BORDER);
Button button = new Button(shell, SWT.PUSH);
button.setText("Push Button");
new StyledTextMessage(styledText2).setMessage("Please enter something stylish...");
shell.setSize(600, 600);
shell.open();
while(!shell.isDisposed()) {
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static final int MARGIN = 2;
private static int[] INVALIDATE_EVENTS = { SWT.Activate, SWT.Deactivate, SWT.Show, SWT.Hide };
private final StyledText styledText;
private final Listener invalidateListener;
private final Color textColor;
private String message;
private int verticalOffsetLines;
public StyledTextMessage(StyledText styledText) {
this.styledText = Objects.requireNonNull(styledText);
this.invalidateListener = this::handleInvalidatedEvent;
this.textColor = getTextColor();
this.message = "";
initialize();
}
public void setMessage(String message) {
this.message = Objects.requireNonNull(message);
this.styledText.redraw();
}
public boolean isMessageShowing() {
return !message.isEmpty() && styledText.getContent().getCharCount() == 0;
}
private void initialize() {
styledText.addListener(SWT.Paint, this::handlePaintEvent);
styledText.addListener(SWT.Resize, event -> styledText.redraw());
styledText.addListener(SWT.Dispose, this::handleDispose);
for(int eventType : INVALIDATE_EVENTS) {
styledText.getDisplay().addFilter(eventType, invalidateListener);
}
}
private Color getTextColor() {
return styledText.getDisplay().getSystemColor(SWT.COLOR_GRAY);
}
private void handlePaintEvent(Event event) {
if(isMessageShowing()) {
drawHint(event.gc, event.x, event.y);
}
}
private void handleDispose(Event event) {
for(int eventType : INVALIDATE_EVENTS) {
styledText.getDisplay().removeFilter(eventType, invalidateListener);
}
}
private void handleInvalidatedEvent(Event event) {
styledText.redraw();
}
private void drawHint(GC gc, int x, int y) {
int verticalOffset = verticalOffsetLines * gc.getFontMetrics().getHeight();
gc.setForeground(textColor);
gc.drawText(message, x + MARGIN, y + MARGIN - verticalOffset, SWT.DRAW_DELIMITER | SWT.DRAW_TRANSPARENT);
}
}