我正在尝试为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);

09-26 17:08