【问题标题】:Java JSlider implementing own logic for left and right arrow keysJava JSlider 为左右箭头键实现自己的逻辑
【发布时间】:2018-03-31 19:46:16
【问题描述】:

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

}

}

【问题讨论】:

    标签: java swing jslider


    【解决方案1】:

    不要使用 KeyListener。

    Swing 旨在与键绑定一起使用。如果您不喜欢给定键绑定的默认操作,则可以替换该操作。

    查看Key Bindings 了解更多信息,这些信息显示了给定组件的默认绑定以及如何替换右/左 KeyStroke 的 Action。

    通过替换现有绑定的Action 来更改现有功能的基础是:

     Action action = new AbstractAction() {...};
     KeyStroke keyStroke = KeyStroke.getKeyStroke(...);
     InputMap im = component.getInputMap(...);
     component.getActionMap().put(im.get(keyStroke), action);
    

    【讨论】:

    • 很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多