Java 图像移动时按钮事件不工作

Java 图像移动时按钮事件不工作,java,image,swing,Java,Image,Swing,我有这个密码。在此代码中,图像使用moveImage方法从左向右移动,并使用moveimg方法从右向左移动。我现在想要的是处理一个按钮事件。代码中有一个按钮,我想当我点击按钮时,它应该完成它的工作。但这不起作用。。代码如下: import java.awt.*; import java.awt.event.*; import javax.swing.*; class MyImage extends JFrame implements ActionListener { static

我有这个密码。在此代码中,图像使用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();
   }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
类MyImage扩展JFrame实现ActionListener
{
静态int xPixel=20;
图像我的图像,屏幕外图像;
影印;
JPanel p=新的JPanel();
按钮btn=新按钮(“bun”);
JFrame f=新的JFrame();
公共MyImage()
{
myImage=Toolkit.getDefaultToolkit().getImage(“mywineshoplogo.jpg”);
setExtendedState(JFrame.MAXIMIZED_两者);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(真);
加(p);
p、 添加(btn);
moveImage();
btn.addActionListener(此);
}
公共空间更新(图g)
{
油漆(g);
}
公共空间涂料(图g)
{
int width=getWidth();
int height=getHeight();
if(offScreenImage==null)
{
offScreenImage=createImage(宽度、高度);
offScreenGraphics=offScreenImage.getGraphics();
}
//清除屏幕外的图像
offScreenGraphics.clearRect(0,0,宽度+1,高度+1);
//把你的图像从屏幕上画下来
offScreenGraphics.drawImage(myImage,xPixel,10,this);
//把你的图像从屏幕上画下来
//显示屏幕外的图像
g、 drawImage(屏幕外图像,0,0,this);
//显示屏幕外的图像
}
void moveImage()//从左向右移动
{
对于(int i=0;i<530;i++)
{
xPixel+=1;
重新油漆();
//然后为你的动画睡一会儿
尝试
{
睡眠(40);
}/*这将暂停50毫秒*/
捕捉(中断异常e)
{
System.err.println(“睡眠异常”);
}
}
}
/*void moveimg()//从右向左移动
{
对于(int i=529;i>0;i--)
{
如果(i==1)
{
moveImage();
}
xPixel-=1;
重新油漆();
//然后为你的动画睡一会儿
尝试
{
睡眠(40);
}//这将暂停50毫秒
捕捉(中断异常e)
{
System.err.println(“睡眠异常”);
}
} 
} */     
已执行的公共无效行动(行动事件ae)
{
尝试
{
如果(ae.getSource()==btn)
{
p、 挫折地面(颜色:红色);
}
}
捕获(例外e)
{
System.out.println(“错误”);
}
}
公共静态void main(字符串参数[])
{
MyImage me=新的MyImage();
}
}

您应该将动画移植到它们自己的线程中。这将停止由于其他进程而导致的主线程锁定。您正在调用
Thread.sleep(40)。这将始终影响您的唯一线程的吞吐量

解决办法

因此,您应该创建一个新类,例如
ImageMover
。这个类可以在它的构造函数中获取图像对象,并有一个方法
moveImage
来移动图像,这与您的
moveImg
moveImage
的解决方案相反(非常混乱的东西)

其次,您希望让
ImageMover
扩展
线程。这将迫使您编写一个
run
方法,该方法如下所示:

public void run() {
    moveImage();
}
当您希望图像开始移动时,应调用
ImageMover.start()
。 不运行
运行


这将把方法放在不同的线程上,并且应该确保GUI的功能。

代码应该放在问题中,而不是简单地链接到。它应该适当地缩进。您应该记得添加一个表示语言的标记。对不起,我不知道怎么做。。我是新来这里的…把问题的代码是一个简单的复制粘贴。要对其进行格式化,请选择代码并单击编辑框顶部的
{}
按钮,或按Ctrl-K键或手动为每行添加4个空格的前缀。要使其缩进,您必须使用外部程序或手动执行。在页面上,您还可以在底部添加标记。手动操作很困难。您能告诉我任何外部程序吗?您正在使用的语言(本例中为Java)中的任何像样的IDE都应该能够正确地缩进/格式化代码。例如,单击源->格式。我确信有些程序具有此功能,但不是一个完整的IDE,但我对任何程序都不太熟悉,您可能会成功。moveImage()用于从左到右移动,moveImg()用于从右到左移动。您认为这是一个合适的命名系统吗?您是否尝试过像我建议的那样将代码移植到其他线程中?是的,但它不起作用。如何向您展示我的新代码?您可以编辑原始问题并将新代码放入其中。