2013-04-27 26 views
0

我正在開發一款遊戲,但是我發現我的MouseWheelListener沒有工作。我簡化了代碼,使問題更清晰。我的MouseWheelListener不起作用

首先,在顯示窗口後,點擊Go In。然後旋轉你的鼠標滾輪,什麼也沒有發生!我該如何解決這個問題?

爲了證明我沒有做出很愚蠢的錯誤,最小化和最大化你的窗口或點擊Do Nothing(這什麼都不做),並再次旋轉你的鼠標滾輪,並且它正常打印!

我正在使用Windows 7 SP1 & JavaSE-1.6 64位。

這是我這有問題簡化代碼:

ControllerPane.java

import java.awt.*; 
import javax.swing.*; 
public class ControllerPane extends JPanel { 
    private static final long serialVersionUID = 1L; 
    public static final String PAGE_MAIN = "MAIN"; 
    public static final String PAGE_LEVEL = "LEVEL"; 
    private CardLayout layout; 
    public ControllerPane() { 
     setLayout(layout = new CardLayout()); 
     add(new MainPane(), PAGE_MAIN); 
     add(new LevelPane(), PAGE_LEVEL); 
    } 
    public void setPage(String page) { 
     layout.show(this, page); 
    } 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.add(new ControllerPane()); 
       f.setSize(316, 338); 
       f.setLocationRelativeTo(null); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

MainPane.java

import java.awt.event.*; 
import javax.swing.*; 
public class MainPane extends JPanel { 
    private static final long serialVersionUID = 1L; 
    public MainPane() { 
     setLayout(null); 
     JButton btnStartGame = new JButton("Go In"); 
     btnStartGame.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       ((ControllerPane) getParent()) 
         .setPage(ControllerPane.PAGE_LEVEL); 
      } 
     }); 
     btnStartGame.setBounds(50, 50, 200, 200); 
     add(btnStartGame); 
    } 
} 

LevelPane.java

import java.awt.event.*; 
import javax.swing.*; 
// FIXME mouseWheelMoved 
public class LevelPane extends JPanel { 
    private static final long serialVersionUID = 1L; 
    public LevelPane() { 
     addMouseWheelListener(new DrawListener()); 
     setLayout(null); 
     JButton btnRetry = new JButton("Do nothing"); 
     btnRetry.setBounds(50, 50, 200, 200); 
     add(btnRetry); 
    } 
    private class DrawListener extends MouseAdapter { 
     @Override 
     public void mouseWheelMoved(MouseWheelEvent e) { 
      System.out.println(e); 
     } 
    } 
} 
+1

工作正常,我... – MadProgrammer 2013-04-27 09:18:52

+0

@MadProgrammer不工作的JavaSE-1.6 – johnchen902 2013-04-27 09:24:53

+0

它並不實際,只是沒有你想要它,檢查我的詳細信息的回答方式;) – MadProgrammer 2013-04-27 09:47:29

回答

3

這是一個焦點問題。由於某種原因,面板需要有焦點,以便能夠處理鼠標事件。您可以通過點擊「無所事事」按鈕並旋轉鼠標滾輪來測試當前代碼...

要修復它,您需要在新激活的面板上調用requestFocusInWindow。問題是,CardLayout沒有辦法訪問當前的卡...

它確實如此,所有其他卡設置爲不可見,這意味着如果我們尋找可見卡,您應該能夠打電話給requestFocusInWindow就可以了...

public void setPage(String page) { 
    layout.show(this, page); 
    for (Component comp : getComponents()) { 
     if (comp.isVisible()) { 
      System.out.println("Activate " + comp); 
      comp.requestFocusInWindow(); 
      break; 
     } 
    } 
} 
+0

哪些事件需要專家組關注?我只知道'KeyEvent'。 – johnchen902 2013-04-27 10:06:22

+0

顯然,在Java 6下的鼠標事件也是這樣,去圖;) - 通常當我運行這種問題時,我所做的第一件事就是確保我想要響應事件的組件具有焦點 – MadProgrammer 2013-04-27 10:07:58