[英]Button event not working while image is moving
我有這個代碼。 在此代碼中,圖像使用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();
}
}
您應該將動畫移植到他們自己的線程上。 這將阻止您的主線程因其他進程而鎖定。 您正在調用Thread.sleep(40);
在主線程上。 這將始終影響您唯一一個線程的吞吐量。
一個解法
因此,您應該創建一個新類,例如ImageMover
。 此類可以在其構造函數中使用Image對象,並具有moveImage
方法來移動圖像,這與您的moveImg
和moveImage
解決方案(非常令人困惑的東西) moveImage
。
其次,您希望ImageMover
擴展Thread
。 這將迫使您編寫一個run
方法,它看起來像這樣:
public void run() {
moveImage();
}
當您希望圖像開始移動時,應調用ImageMover.start()
。 不 run
。
這會將方法放置在其他線程上,並應確保GUI的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.