我正在尝试为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);
}
}
答案 0 :(得分:3)
不要使用KeyListener。
Swing旨在与Key Bindings一起使用。如果您不喜欢给定键绑定的默认Action,则可以替换Action。
查看Key Bindings以获取更多信息,其中显示了给定组件的默认绑定以及如何替换右/左键击中的操作。
通过替换现有绑定的Action
来更改现有功能的基础是:
Action action = new AbstractAction() {...};
KeyStroke keyStroke = KeyStroke.getKeyStroke(...);
InputMap im = component.getInputMap(...);
component.getActionMap().put(im.get(keyStroke), action);