【问题标题】:create slider from JButton从 JButton 创建滑块
【发布时间】:2014-02-14 16:10:05
【问题描述】:

我在 JPanel 上有 JTextFieldJButton。我想将监听器添加到JButton,这样当我按下按钮并移动鼠标时,文本字段的值开始改变(当我向右移动鼠标时增加,当我向左移动鼠标时减少)。所以它有点像滑块。这是代码

 final JPanel panel=new JPanel();
 final JTextField text = new JTextField("10");
 JButton button=new JButton("f");
 panel.add(text);
 panel.add(button);

 button.addMouseListener(new MouseAdapter(){
        @Override
        public void mousePressed(final MouseEvent evt){

        //here we add listener to read mouse position when mouse pressed on button
        panel.addMouseListener(new MouseAdapter(){

                int x1 = evt.getXOnScreen();

                int x2;

                @Override
                public void mouseMoved(MouseEvent e){
                    // this method is never called
                    x2=e.getXOnScreen();
                    //increase(decrese) number in textfield by 1% for every moved pixel
                    double d = (x2-x1)*0.01+Double.parseDouble(text.getText());
                    text.setText(Double.toString(d));
                    x1=x2;

                                                    }


                                              });

                        }
       // now, when mouse released we should remove listener from panel
        @Override
        public void mouseReleased(final MouseEvent evt){
            MouseListener[] ml = panel.getListeners(MouseListener.class);
            panel.removeMouseListener(ml[0]);


        }
    });

问题是,panelListener 的 mouseMoved 方法永远不会被调用。我该怎么办?

【问题讨论】:

    标签: java swing mouseevent


    【解决方案1】:

    随便用

    panel.addMouseMotionListener(...)
    

    代替:

    panel.addMouseListener(...)
    

    来自Java Docs

    公共接口 MouseListener: 用于接收组件上“有趣的”鼠标事件(按下、释放、单击、进入和退出)的侦听器接口。 (要跟踪鼠标移动和鼠标拖动,请使用 MouseMotionListener。)

    【讨论】:

      【解决方案2】:

      MouseMotionListener 添加到您的按钮并使用mouseDragged。坐标可以存储在Point 上的MouseEventMouseListener.mousePressed() 中。这样您就无需添加和删除侦听器:

      import java.awt.BorderLayout;
      import java.awt.Point;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      import java.awt.event.MouseMotionListener;
      
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.JTextField;
      
      public class Application {
      
        public static void main(String[] args) {
          final JFrame frame = new JFrame("FrameDemo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          final JPanel panel = new JPanel();
          final JTextField text = new JTextField("10");
          final JButton button = new JButton("f");
          panel.add(text);
          panel.add(button);
          final Point point1 = new Point();
          final Point point2 = new Point();
          button.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(final MouseEvent evt) {
              point1.x = evt.getXOnScreen();
            }
          });
          button.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
              System.out.println(e);
              point2.x = e.getXOnScreen();
              double d = (point2.x - point1.x) * 0.01 + Double.parseDouble(text.getText());
              text.setText(Double.toString(d));
              point1.x = point2.x;
            }
            @Override
            public void mouseMoved(MouseEvent e) {
            }
          });
          frame.getContentPane().add(panel, BorderLayout.CENTER);
          frame.pack();
          frame.setVisible(true);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        相关资源
        最近更新 更多