Java JSlider为左右箭头键实现自己的逻辑

时间:2018-03-31 19:46:16

标签: java swing jslider

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

}

}

1 个答案:

答案 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);