使用Java中的EventHandler使形状来回移动

时间:2015-09-08 04:12:07

标签: java eclipse user-interface animation

我认为我的头衔很好地总结了我的问题。我真的很喜欢编程(使用Head First Java大约2-3周的自学教学),我正在尝试使用Action Listener在屏幕上来回移动,直到用户终止程序。我的问题是我有一个Timer和2个类实现Action Listener。我可以让它来回跑一次,但这就是我能做到的全部。

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

我已经看到人们使用按钮来回移动东西或移动东西一定次数的问题,但我希望定时器能够完成所有操作直到用户退出。这样用户只需要观看。我没有用我的main方法包含该类,因为它只是设置了gui并调用了这个类。

1 个答案:

答案 0 :(得分:1)

首先,请查看Painting in AWT and SwingPerforming Custom Painting,了解有关绘画在Swing中如何运作的详细信息。

基本上,Swing使用被动渲染算法,这意味着任何时候出于任何原因都可能出现绘画周期,大部分时间没有您的直接干预。

你永远不应该在任何paint方法中更改组件的状态,paint方法应该绘制它,而不是它。

有许多小问题,首先,您要将Window类和HandlerClass ActionListener添加到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 ,这意味着你可能会进入这两个听众互相竞争对象应该移动的位置。最好将移动逻辑放在一个方法中,例如:

->addBudget()