JSpinner не реагирует на MouseWheelEvent в Windows
Это сбивает меня с толку: у меня есть небольшое приложение, которое использует JSpinner
для числовых значений. Я добавил MouseAdapter
к нему, установка значения в зависимости от результирующего события getScrollAmount()
а также getWheelRotation()
,
Все работает довольно хорошо, если приложение работает в Linux (Debian Wheezy, Oracle JDK 1.6.0_32). То есть прокрутка колесика мыши, когда JSpinner имеет фокус, работает просто отлично (с помощью GTK LookAndFeel).
Тестирование программного обеспечения в Microsoft Windows показало другое поведение: JSpinner
не будет реагировать на движение колесика мыши. LookAndFeel
Кажется, здесь нет проблем, как я уже пытался MetalLookAndFeel
на Linux и Windows.
Любые предложения о том, как заставить этот JSpinner реагировать на MouseWheelEvent
на обеих ОС?
Спасибо.
1 ответ
Хм, я не уверен, что может быть не так, но вот код, разработанный для Windows 7, и он отлично работает, так что, возможно, попробуйте на своем и посмотрите, где код отличается:
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
/**
*
* @author David
*/
public class JSpinnerMouse extends JFrame {
private JSpinner jspinner;
public JSpinnerMouse() {
createAndShowUI();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Nimbus is not available, you can set the GUI to another look and feel.
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JSpinnerMouse jSpinnerMouse = new JSpinnerMouse();
}
});
}
private void createAndShowUI() {
setTitle("JSpinner using mouse wheel");
setSize(300, 300);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
addComponentsToContentPane(getContentPane());
addListeners();
setVisible(true);
}
private void addComponentsToContentPane(Container contentPane) {
jspinner = new JSpinner();
contentPane.add(jspinner);
}
private void addListeners() {
this.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent mwe) {
if (MouseWheelEvent.WHEEL_UNIT_SCROLL == mwe.getScrollType()) {
int value = (int) jspinner.getValue();
if (mwe.getWheelRotation() == -1) {//up
jspinner.setValue(value + 1);
} else {//down
jspinner.setValue(value - 1);
}
}
}
});
}
}
Кроме того, я не смог найти метод getDirection() в MouseWheelEvent, как вы сказали, что вы используете, поэтому я использовал getUnitsToScroll(), который будет возвращать положительное или отрицательное значение в зависимости от направления. Может быть, это то, что вызывает проблемы. Где вы нашли метод getDirection() в классе MouseWheelEvent?