我正在尝试为JSlider中的左右箭头键实现自己的逻辑。
默认情况下,JSlider基于左右箭头将滑块向左和向右移动。我可以阻止它移动滑块的唯一方法是将setFocusable设置为false,但这会使我的addKeyListener无法正常工作。是否有任何方法可以覆盖或关闭此默认操作,所以我的addKeyListener是响应键事件的唯一方法?
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class slider {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Slider Test");
JSlider slider = new JSlider();
slider.setToolTipText("Slide the time.");
slider.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
slider.setOpaque(false);
slider.setPaintTrack(true);
slider.setPaintTicks(true);
slider.setPaintLabels(false);
slider.setMinimum(0);
slider.setMaximum(100);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
slider.setOrientation(JSlider.HORIZONTAL);
slider.setSnapToTicks(false);
slider.setFocusable(true);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println("I have changed :(");
}
});
slider.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
// right arrow
if(keyCode == 39) {
System.out.println("do right arrow key logic");
}
// left arrow
if(keyCode == 37) {
System.out.println("do left arrow key logic");
}
}
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(slider);
frame.pack();
frame.setVisible(true);
}
}
最佳答案
不要使用KeyListener。
Swing被设计为与键绑定一起使用。如果您不喜欢给定键绑定的默认操作,则可以替换该操作。
请查看Key Bindings以获取更多信息,该信息显示给定组件的默认绑定以及如何为您的左右键击替换Action。
通过替换现有绑定的Action
来更改现有功能的基础是:
Action action = new AbstractAction() {...};
KeyStroke keyStroke = KeyStroke.getKeyStroke(...);
InputMap im = component.getInputMap(...);
component.getActionMap().put(im.get(keyStroke), action);