2011-09-27 52 views
2

我被困在鼠標輪事件中,但不會觸發。我使用swt_awt bridge,所以我可以在我的RCP應用程序中使用swing組件。我測試了我能找到的所有東西,但沒有成功。因爲我的應用程序非常複雜,所以我創建了一個簡化版本的問題,這也可以幫助您確定是否希望幫助我。MouseWheel事件不會在SWT-AWT組件中觸發

現在這個簡化的問題是,我希望我的textarea(或scrollpane)捕捉mousewheel事件。但是這些事件已經消失。

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"); 
      } 

     }); 
    } 
} 

編輯:我發現,該小組能夠趕上AWT事件,但任何一類,即擴展JComponent的(就像我的組件,請)莫名其妙地失去這些事件。 我也設法創建一個醜陋的黑客,我點擊我的JComponent後,我強制我的swt複合材料。然後,我可以至少聽swt事件,並直接從swt事件監聽器使用我的JComponent。我仍然讚賞這個解決方案,我將能夠直接在JComponent上捕獲awt鼠標事件。

回答