我认为我的标题很好地概括了我的问题。我对编程真的很陌生(大约2-3周使用Head First Java自学),我正在尝试使用Action Listener在屏幕上来回移动一个正方形,直到用户终止程序。我的问题是我有一个计时器和两个实现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并调用这个类。
发布于 2015-09-08 12:40:28
首先,看看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 Windowhttps://stackoverflow.com/questions/32449163
复制相似问题