2015-09-08 52 views
0

我認爲我的標題很好地總結了我的問題。我對編程非常陌生(使用Head First Java進行大約2-3周的自我教學),並且我嘗試使用Action Listener在屏幕上來回移動,直到用戶終止程序。我的問題是我有一個Timer和2個類實現Action Listener。我可以讓它來回運行一次,但這就是我所能做到的。使用Java中的EventHandlers來回移動形狀

package Animation; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class Window extends JPanel implements ActionListener{ 
int x = 100; 
Timer timer = new Timer(5, this); 
int velX = 2; 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    this.setBackground(Color.BLACK); 
    g.setColor(Color.BLUE); 
    g.fill3DRect(x, 150, 200, 200, true); 
    timer.start(); 
    if(x >= 1000){ 
     timer.addActionListener(new HandlerClass()); 
      }//end if 

    }//end paintComponent 

public void actionPerformed(ActionEvent e){ 
    x += velX; 
    repaint(); 
}//end actionP method 

public class HandlerClass implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(x >= 100){ 
     x -= velX; 
     repaint(); 
     } 
    }//end actionP 
}//end Handler 

}//end Window 

我見過人們使用按鈕來搬東西來回或移動的東西的設定次數的問題,但我希望定時器做的一切,直到用戶退出。這樣用戶只需要觀看。我沒有將我的主要方法包括進來,因爲它只是設置了gui並稱爲這個類。

回答

1

首先,請查看Painting in AWT and SwingPerforming Custom Painting瞭解有關如何在Swing中繪畫的更多詳細信息。

基本上,Swing使用被動渲染算法,這意味着任何時候出於任何原因都可能出現繪畫循環,大部分時間沒有您的直接干預。

您不應該在任何繪畫方法中更改組件的狀態,繪畫方法應該繪畫,就是這樣。

有一些小問題,首先,要添加的Window類和HandlerClassActionListener年代到Timer,這意味着你可能會進入一兩個聽衆,每個競爭的位置其他物體應該以何種方式移動。更好地把你的運動邏輯放在一個單一的方法,例如:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Window extends JPanel { 

    int x = 100; 
    Timer timer = new Timer(5, new HandlerClass()); 
    int velX = 2; 

    public Window() { 
     this.setBackground(Color.BLACK); 
     timer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 400); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.fill3DRect(x, 150, 200, 200, true); 

    }//end paintComponent 

    public class HandlerClass implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      x += velX; 
      if (x + 200 >= getWidth()) { 
       x = getWidth() - 200; 
       velX *= -1; 
      } else if (x < 0) { 
       x = 0; 
       velX *= -1; 
      } 
      repaint(); 
     }//end actionP 
    }//end Handler 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new Window()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

}//end Window 
+0

謝謝,它現在看到它應該如何工作更有意義。我想我過於複雜了。 – user5311076