我有这个代码。在此代码中,图像使用moveImage方法从左向右移动,并在代码中使用moveimg方法从右向左移动。我现在想要的是按钮事件。代码中有一个按钮,我想当我点击按钮它应该完成它的工作。但它没有......这里的代码是:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyImage extends JFrame implements ActionListener
{
static int xPixel = 20;
Image myImage, offScreenImage;
Graphics offScreenGraphics;
JPanel p = new JPanel();
Button btn = new Button("bun");
JFrame f = new JFrame();
public MyImage()
{
myImage = Toolkit.getDefaultToolkit().getImage("mywineshoplogo.jpg");
setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
add(p);
p.add(btn);
moveImage();
btn.addActionListener(this);
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
int width = getWidth();
int height = getHeight();
if (offScreenImage == null)
{
offScreenImage = createImage(width, height);
offScreenGraphics = offScreenImage.getGraphics();
}
// clear the off screen image
offScreenGraphics.clearRect(0, 0, width + 1, height + 1);
// draw your image off screen
offScreenGraphics.drawImage(myImage, xPixel, 10, this);
// draw your image off screen
// show the off screen image
g.drawImage(offScreenImage, 0, 0, this);
// show the off screen image
}
void moveImage() //left to right move
{
for (int i = 0; i < 530; i++)
{
xPixel += 1;
repaint();
// then sleep for a bit for your animation
try
{
Thread.sleep(40);
} /* this will pause for 50 milliseconds */
catch (InterruptedException e)
{
System.err.println("sleep exception");
}
}
}
/* void moveimg() // right to left move
{
for (int i = 529; i > 0; i--)
{
if (i == 1)
{
moveImage();
}
xPixel -= 1;
repaint();
// then sleep for a bit for your animation
try
{
Thread.sleep(40);
} // this will pause for 50 milliseconds
catch (InterruptedException e)
{
System.err.println("sleep exception");
}
}
} */
public void actionPerformed(ActionEvent ae)
{
try
{
if (ae.getSource() == btn)
{
p.setBackground(Color.RED);
}
}
catch (Exception e)
{
System.out.println("error");
}
}
public static void main(String args[])
{
MyImage me = new MyImage();
}
}
答案 0 :(得分:0)
您应该将动画移植到自己的线程中。这将阻止您的主线程因其他进程而锁定。你在主线程上调用Thread.sleep(40);
。这将不可避免地影响您的唯一线程的吞吐量。
解决方案
所以,你应该创建一个新类,比如ImageMover
。这个类可以在它的构造函数中使用Image对象,并使用方法moveImage
来移动图像,而不是moveImg
和moveImage
的解决方案(非常令人困惑的东西)。
其次,您希望ImageMover
扩展Thread
。这将迫使您编写一个run
方法,它看起来像这样:
public void run() {
moveImage();
}
如果您希望图片开始移动,请致电ImageMover.start()
。
不 run
。
这会将方法放在不同的线程上,并应确保GUI的功能。