1

私は、MouseMotionListenerに登録されたいくつかのサブフィギュア(ボタン。ツールバーレイアウトを使用)を含む親draw2dフィギュアを使用しており、マウスエンターで何らかのアクション(たとえば「enterAction」)を実行し、マウス出口(「exitAction」)で何か他のことを実行します。

何らかの理由で、サブボタンの1つをポイントしているときに「exitAction」が呼び出されます。
親フィギュアのすべての子をMouseMotionListenerイベントに再帰的に登録しようとしましたが、「問題は解決しました」(「exitAction」が発生しましたが、ボタンの「enterAction」でキャッチして処理しました)-別の問題発生:ボタンの「actionPerformed」イベント(ボタンにActionListenerを追加しました)が発生しません(または発生しますが、見つからない場所で処理されます...)。

何か助けはありますか?:\
ありがとう!

4

1 に答える 1

0

draw2d では、html のように要素を介してマウス イベントが伝搬されないため、これを一般的に解決するのは困難です。

たとえば、リスナーをキャンバスに移動できます。

import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.Button;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.ScalableLayeredPane;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

public class HHH {

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell();
    shell.setLayout(new FillLayout());

    final FigureCanvas canvas = new FigureCanvas(shell);
    final ScalableLayeredPane pane = new ScalableLayeredPane();
    pane.setScale(1.5f);

    canvas.setContents(pane);

    final Layer layer = new Layer();
    layer.setLayoutManager(new XYLayout());
    pane.add(layer);

    final Figure container = new Figure();
    container.setOpaque(true);
    container.setBackgroundColor(ColorConstants.lightBlue);
    container.setLayoutManager(new XYLayout());
    layer.add(container, new Rectangle(100, 100, 100, 100));

    final Button b = new Button("Push");
    b.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent event) {
            MessageBox box = new MessageBox(shell);
            box.setText("button pressed");
            box.open();
        }
    });
    container.add(b, new Rectangle(10, 10, -1, -1));

    canvas.addMouseMoveListener(new MouseMoveListener() {

        Border oldBorder = null;
        boolean over = false;

        @Override
        public void mouseMove(org.eclipse.swt.events.MouseEvent e) {
            final Rectangle containerBounds = container.getBounds().getCopy();
            container.translateToAbsolute(containerBounds);

            if (containerBounds.contains(e.x, e.y)) {
                // simulate enter container figure
                if (!over) {
                    oldBorder = container.getBorder();
                    container.setBorder(new LineBorder());
                    over = true;
                }
            } else {
                // simulate exit container figure
                if (over) {
                    container.setBorder(oldBorder);
                    oldBorder = null;
                    over = false;
                }
            }
        }

    });

    shell.setSize(500, 500);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }

}

}
于 2012-12-13T12:07:52.160 に答える