Событие MouseWheel не запускается в компоненте SWT-AWT - PullRequest
2 голосов
/ 27 сентября 2011

Я застрял на событии колесика мыши, которое просто не срабатывает.Я использую мост swt_awt, поэтому я могу использовать компонент Swing в своем приложении RCP.Я проверил все, что смог найти, но безуспешно.Поскольку мое приложение ужасно сложное, я создал упрощенную версию своей проблемы, которая также должна помочь вам сориентироваться, если вы хотите мне помочь.

Теперь эта упрощенная проблема заключается в том, что я хочу, чтобы моя текстовая область (илиscrollpane), чтобы ловить события колесика мыши.Но эти события потеряны.

import java.awt.Frame;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;


public class Main {

    protected Shell shell;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            Main window = new Main();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the window.
     */
    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("SWT Application");
        shell.setLayout(new GridLayout(3, false));

        List list = new List(shell, SWT.BORDER);
        list.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        list.add("Something");

        Composite composite = new Composite(shell, SWT.EMBEDDED);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        Frame graphFrame = SWT_AWT.new_Frame(composite);
        final JTextArea textarea = new JTextArea(60, 80);
        JScrollPane scrollpane = new JScrollPane(textarea);
        graphFrame.add(scrollpane);

        textarea.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent arg0) {
                textarea.setText(textarea.getText() + "Mouse clicked.\n\r");
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
                textarea.setText(textarea.getText() + "Mouse is in.\n\r");
            }

            @Override
            public void mouseExited(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseReleased(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

        });

        textarea.addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent arg0) {
                textarea.setText(textarea.getText() + "Mouse wheel activated.\n\r");
            }

        });
    }
}

РЕДАКТИРОВАТЬ: Я обнаружил, что Panel может перехватывать события awt, однако любой класс, который расширяет JComponent (как и мой компонент), каким-то образом теряет эти события.Мне также удалось создать некрасивый хак, где я нажимаю на свой композит SWT после того, как нажму на мой JComponent.Тогда я могу, по крайней мере, слушать события SWT и работать с моим JComponent напрямую из прослушивателя событий SWT.Я бы все равно оценил решение, в котором я смогу перехватывать события мыши awt прямо на JComponent.

1 Ответ

1 голос
/ 12 января 2013

Возможно, вы столкнулись с этой проблемой: http://code.google.com/p/gama-platform/issues/detail?id=84. Обходной путь описан в http://code.google.com/p/gama-platform/issues/detail?id=84#c13 (связан с этим вопросом).

...