移动时,图像有一种奇怪的行为?

时间:2018-06-03 06:02:45

标签: java swing timer jlabel

本程序使用一个矩形,其中Ball可以从JLabel中抓取Image Timer

问题出在JLabel类中,计数器计算时间。计算时间显示在Image上。但是应该抓住Ball的{​​{1}},每次跳到起始位置,都会产生颤抖。

我尝试删除JLabel并使用System.out.println(),但它也有效。

也许Swing Timer不喜欢JLabel的来电,可能是什么原因?

SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS");
timeL.setText("Time  :" + df.format(duration - clockTime));
//System.out.println("Time  :" + df.format(duration - clockTime));

1 个答案:

答案 0 :(得分:0)

代码有点修改,它按预期工作,我希望它是正确的。

现在,图像可以独立于Ball的速度移动,图像保持在移动位置。

要添加图片,请在项目文件夹中添加一个名为" resources"的新文件夹。我用Netbeans 8.2测试了它。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ImageMoveTest implements ActionListener {
 JPanel panel;
 Image rimg;
 Thread t;
 int x;
 int y;
 int v;
 int z;
 int n;

 public static void main(String[] args) throws InterruptedException,  IOException {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
   try {
       new ImageMoveTest().startApp();
   } catch (InterruptedException ex) {
       Logger.getLogger(ImageMoveTest.class.getName()).log(Level.SEVERE,  null, ex);
   } catch (IOException ex) {
       Logger.getLogger(ImageMoveTest.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
  });
 } 

 public void startApp() throws InterruptedException, IOException {
  panel = new DrawPanel();
  InputStream inStream =  this.getClass().getClassLoader().getResourceAsStream("i6.jpeg");
  BufferedImage img = ImageIO.read(inStream);
  rimg = img.getScaledInstance(150, 150, Image.SCALE_SMOOTH);
  MoveMouse mm = new MoveMouse();
  panel.addMouseMotionListener((MouseMotionListener) mm);

  JFrame f = new JFrame();
  f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
  f.getContentPane().add(panel).setBackground(Color.white);
  f.setSize(750, 750);
  f.setResizable(false);
  f.setVisible(true);
  f.setLocationRelativeTo(null);
  MathC mc = new MathC();
  t = new Thread(mc);
  t.start();
 }

 class MoveMouse extends JPanel implements MouseMotionListener {
  @Override
  public void mouseDragged(MouseEvent e) {
   v=e.getX();  
   z=e.getY();
   this.repaint();
  }

  @Override
  public void mouseMoved(MouseEvent e) {

  }
 } 

 class MathC implements Runnable {
  @Override
  public void run() {
   while(true) {
    // x,y here
    x = (int) (Math.random() * panel.getWidth());
    y = (int) (Math.random() * panel.getHeight());
    panel.repaint();
     try {
       t.sleep(700);
     } catch (InterruptedException ex) {
       Logger.getLogger(ImageMoveTest.class.getName()).log(Level.SEVERE,  null, ex);
      }
     } 
    } 
   }
   @Override
   public void actionPerformed(ActionEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To  change body of generated methods, choose Tools | Templates.
   }

   class DrawPanel extends JPanel {
    public void update(Graphics g) {
     super.paintChildren(g);
    }   

    public void paintChildren( Graphics g) {
     super.paintChildren(g);
     drawIt(g);
     // repaint the backround to see the single circle moving
     // draw the Ball
     g.setColor(Color.red);
     g.fillOval(x, y, 35, 35);
     g.drawOval(x, y, 35, 35);
     this.repaint();
    }
    public void drawIt(Graphics g) {
     super.paintChildren(g);
     // draw Rectangle
     g.drawRect(0,0,this.getWidth(),this.getHeight());     
     // draw the Image
     g.drawImage(rimg, v, z, this);
     this.repaint();
    }
   }
  }