2013-04-27 4 views
0

Я разрабатываю игру, но я нашел, что мой MouseWheelListener не работал. Я упростил свой код, чтобы сделать вопрос более ясным.My 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

+0

@MadProgrammer не работает на JavaSE-1,6 – johnchen902

+0

это делает на самом деле, просто не так, как вы хотите, чтобы проверить мой ответ на детали;) – MadProgrammer

ответ

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

+0

Очевидно, что и событие мыши под Java 6, go figure;) - Обычно, когда я запускаю эту проблему, первое, что я делаю, это убедиться, что компонент, который я хочу ответить на события, имеет фокус – MadProgrammer