私は下の図に示すUI /エディタを作成しました。テキストはStyledText
で表示されます。黒い線は実際にはLabel
の線で描かれたカスタムボーダーです。SWT MouseDownイベントがカスタム選択コントロールであまりにも支配的です
今、私の目標は、ユーザーがそれらを削除したり、それらに他の人を追加するControl
Sを選択することを可能にする選択を提供することです。 2番目の画像は選択例を示しています。だから、すべての種類のMouseEvent
で始まりました。これは私が最初に考えたより複雑です。 MouseDown
イベントは、私は、ユーザーがMouseMove
イベントは、マウスがリリースされるまでMouseDown
イベントを発射した同じコントロールが含まれているので、選択したい他のControl
Sを追跡することはできませんよどのControl
に解雇され
。選択したControl
の視覚的なフィードバックを提供するために、進行中の選択を追跡する必要があります。以下のコードは、動作を示す最小限の例を示しています。
public class Tester {
public static void main(String[] args)
{
Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("Stackoverflow");
Composite comp = new Composite(shell, SWT.NONE);
comp.setLayout(new GridLayout(1, true));
SelectionListener listener = new SelectionListener();
StyledText text = new StyledText(comp, SWT.NONE);
text.setText("first text");
attachListener(text, listener);
text = new StyledText(comp, SWT.NONE);
text.setText("second text");
attachListener(text, listener);
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static void attachListener(Control control, Listener listener) {
if(control != null && !control.isDisposed()){
control.addListener(SWT.MouseDown, listener);
control.addListener(SWT.MouseMove, listener);
control.addListener(SWT.MouseEnter, listener);
control.addListener(SWT.MouseUp, listener);
}
}
static class SelectionListener implements Listener {
Event lastEvent = null;
@Override
public void handleEvent(Event event) {
switch(event.type){
case SWT.MouseDown:
lastEvent = event;
break;
case SWT.MouseMove:
if(lastEvent != null){
if(event.widget == lastEvent.widget)
System.out.println("the same!!!");
else
System.out.println("not the same!!!");
}
break;
case SWT.MouseEnter:
//this also does not fire when MouseDown is fired
System.out.println("entering");
break;
case SWT.MouseUp:
lastEvent = null;
break;
}
}
}
}
ですから、基本的に私は手助けをしています。たぶん、これを達成するためのより良い/より簡単な方法があります。私はまた、複数の選択をサポートするテーブルや他のコントロールで、これをswtがどうやって行っているのかを調べようとしていました。しかし、特定のコードを見つけるのは難しいし、テーブルなどのネイティブコントロールのネイティブメソッドを呼び出すこともあります。だから誰かがアイデアを持っていれば分かち合う。
セクションを右にドラッグして複数のセクションを選択しますか? –
はい、指定されたコントロール(ラベルとStyledTexts)にあります。現在、私が特定のコントロールを残した後、自分自身でMouseUpイベントを送信するアプローチに取り組んでいます。その後、他のすべてのイベントが再び発生します。 – lolung