2017-02-04 18 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

    ...、Math.toDegrees()とMath.toRadians()の使用を注意してくださいあなたの「生徒」ボタンはどんな感じですか? – MadProgrammer

    +0

    通常のJButtonのようです。 student.javaはJButtonを拡張します。したがって、studentの新しいインスタンスを作成すると、上記のコードでbtnディメンションが指定されています(btn.setBounds) – Tiff

    答えて

    3

    コード内に何らかのアニメーションコンセプトが必要です。場所を更新するだけでスムーズに動かないでしょう。あなたはマウスリスナーから

    • 削除のsetLocation()のコードを必要とする変更
    • ボタン位置の計算と更新をトリガーするタイマー
    • 経過時間与えられた現在位置、角度などの補間

    例。ここでは、合計距離を計算し、時間と速度に基づいて「今までの距離」を補間しています。あなたが本当にすべてであなたが他の場所度としてANGを使用する場合を除き、それらを必要としませんが

    も何

    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

    Ah!ありがとう、アダム - これは完璧です(それは動作します)。私はTimerを使用しようとしましたが、ActionListenerにアタッチしなければならないというエラーを受け取ったときに私の方法を失いました - しかし、私はMouseListenerを使用する必要があったので、混乱しました。私はあなたを支持しましたが、私は新しいユーザーですので、明らかに公開されません;)あなたの助けと迅速な対応をもう一度感謝します! – Tiff

    +0

    私の答えがあなたの問題を解決するならば、喜んで喜んで助けてください、灰色のダニをクリックして "受け入れる"ことを検討してください。ありがとう – Adam

    +0

    完了しました。http://stackoverflow.com/help/someone-answers再度、感謝します! – Tiff

    関連する問題