2017-02-04 78 views
0

我比初學者對Java的理解稍微好一點,我在學生作業時遇到了問題。我不得不將一個類(student.java)「轉換爲一個按鈕」 - 這是我所做的(這就是爲什麼而不是創建一個JButton的新實例,我的代碼創建了一個新的「student」實例)。我需要將按鈕重新定位到用戶點擊鼠標的任何位置。我已經成功完成了這個任務,所以我的任務需求得到了滿足。
但是,我想讓按鈕順利移動到鼠標點擊的位置,而不是突然從前一個位置跳到新位置。以下是我的代碼。 mouseClicked()方法內部的數學是我嘗試過的,但它對按鈕的運動沒有影響。順利地將JButton組件移動到java中的鼠標單擊位置

  • 空佈局需要
  • 必須使用MouseListener的(不是的ActionListener)
  • 按鈕必須是學生類的一個實例

任何提示將不勝感激。謝謝!

public myJPanel(){ 
    super(); 
    setLayout(null); 
    setBackground(Color.decode("#F5F2EB")); 
    setVisible(true); 
    setPreferredSize(new Dimension(640,480)); 
    setMinimumSize(new Dimension(640,480)); 
    setMaximumSize(new Dimension(640,480)); 
    Font f = new Font("Copperplate Gothic Bold", Font.BOLD, 16); 
    student btn = new student("First","Last", num, ""); 
    add(btn); 
    btn.setBounds(100, 150, 400, 90); 
    btn.setText(btn.getInfo()); 
    btn.setBackground(Color.decode("#89A690")); 
    btn.setForeground(Color.decode("#F5F2EB")); 
    btn.setOpaque(true); 
    btn.setFont(f); 
    btn.setBorder(BorderFactory.createEmptyBorder(20, 40, 20, 40)); 

    // move btn object 
    addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 
     int x = e.getX(); //mouse click x position 
     int y = e.getY(); //mouse click y position 
     int px = btn.getX() - x; //previous btn x position(to get distance between old/new position) 
     int py = btn.getY() - y; //previous btn y position(to get distance between old/new position) 
     double speed = 5; //speed 
     double ang = (float)Math.atan2(py, px) * 180/Math.PI; //angle 
     x += Math.cos(ang * Math.PI/180) * speed; //move to x 
     y += Math.sin(ang * Math.PI/180) * speed; //move to y 
     btn.setLocation(x,y); //relocate button to new location 
    }}); 
+0

是什麼你的「學生」按鈕看起來像? – MadProgrammer

+0

它看起來像一個普通的JButton。 student.java擴展了JButton。所以當你創建一個新的學生實例時,它有上面的代碼(btn.setBounds) – Tiff

回答

3

在代碼中需要某種動畫概念,只需更新位置就不會平滑移動。您需要

  • 刪除setLocation()從小鼠聽者代碼更改
  • 定時器來觸發的按鈕位置計算和更新
  • 給定的經過時間的當前位置,角度等的內插

例。這裏我計算了總距離,然後根據時間和速度插入了「迄今爲止的距離」。

還要注意使用Math.toDegrees()和Math.toRadians(),雖然你並不真正需要它們在所有的,除非你想用昂其他地方度...

public class Foo { 
    private static class Animate extends JPanel { 
     private JButton btn; 
     private int startX; 
     private int startY; 
     private long startTime; 
     private double ang; 
     private double distance; 

     public Animate() { 
      super(); 
      setLayout(null); 
      btn = new JButton("Dr Horse"); 
      btn.setBounds(100, 150, 40, 10); 
      add(btn); 
      addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        startX = btn.getX(); 
        startY = btn.getY(); 
        startTime = System.nanoTime(); 
        int px = btn.getX() - e.getX(); 
        int py = btn.getY() - e.getY(); 
        distance = Math.sqrt(px * px + py * py); 
        ang = Math.toDegrees(Math.atan2(py, px)); 

       } 
      }); 
      Timer timer = new Timer(1000/20, new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        double duration = (System.nanoTime() - startTime)/1e6; 
        int speed = 50;// pixels per second 
        double distanceSoFar = Math.min(speed * duration/1000d, distance); 
        int x = startX - (int) (distanceSoFar * Math.cos(Math.toRadians(ang))); 
        int y = startY - (int) (distanceSoFar * Math.sin(Math.toRadians(ang))); 
        btn.setLocation(x, y); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.start(); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.getContentPane().add(new Animate()); 
     frame.setSize(500, 400); 
     frame.setVisible(true); 
    } 

} 
+0

注意到的btn尺寸啊!非常感謝你,亞當 - 這是完美的(它有效)。我試過使用Timer,但是當我收到錯誤信息,說明它必須連接到ActionListener時,我迷失了方向 - 但我需要使用MouseListener,因此感到困惑 - 現在我明白了。我向你投票贊成,但我是新用戶,顯然,它不會公開顯示;)再次感謝您的幫助和快速響應! – Tiff

+0

不用擔心,很高興提供幫助,如果我的答案解決了您的問題,請點擊灰色的勾號來考慮「接受」它。請參閱http://stackoverflow.com/help/someone-answers謝謝 – Adam

+0

完成。再次感謝! – Tiff

相關問題