我认为我的头衔很好地总结了我的问题。我真的很喜欢编程(使用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并调用了这个类。
答案 0 :(得分:1)
首先,请查看Painting in AWT and Swing和Performing 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()