2014-02-13 18 views
1

創建滑塊我已經的JPanel得到的JTextField的JButton。我想添加監聽器到JButton,這樣當我按下按鈕並移動鼠標時,文本框的值開始改變(當我向右移動鼠標時增加,當我向左移動鼠標時增加)。所以它就像滑塊一樣。這裏是代碼從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方法永遠不會被調用。我該怎麼辦?

回答

1

添加MouseMotionListener到您的按鈕,並使用mouseDragged。座標可以存儲在PointMouseEventMouseListener.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); 
    } 
} 
2

只需使用

panel.addMouseMotionListener(...) 

代替:

panel.addMouseListener(...) 

Java Docs

公共接口的MouseListener:的偵聽器接口用於接收 「感興趣」 的鼠標事件(按下,釋放,點擊,進入和退出)噸。 (要跟蹤鼠標移動和鼠標拖動,請使用的MouseMotionListener。)