【问题标题】:Java - drawing image with TimerJava - 使用计时器绘制图像
【发布时间】:2013-04-25 17:50:38
【问题描述】:

我正在创建一个看起来像这样的动画。

我希望左侧的漩涡状图标(即 ImageIcon)显示 3 秒钟然后消失。但是,漩涡状图标并没有消失。

这是我的代码。

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {

        JFrame f = new JFrame("random title");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }
}

class MyPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    public int x;
    public int y;
    public int remoteControllerX = 473;
    public int remoteControllerY = 340;
    public int buttonX = 166;
    public int buttonY = 208;
    Image img;
    Image remoteController;
    ImageIcon button = new ImageIcon("graphics/button.gif");
    Component buttonTrigger = this;

    public MyPanel() {

        try {
            img = ImageIO.read(new File("graphics/close_0.jpg"));
        } catch (IOException e) {

            e.printStackTrace();
        }
        try {
            remoteController = ImageIO.read(new File("graphics/pilot.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        setBorder(BorderFactory.createLineBorder(Color.black));

        new Timer(3000, paintTimer).start();

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                // Here goes action on background, which is unrelated to this example.
            }
        });
    }

    public Dimension getPreferredSize() {
        return new Dimension(1048, 484);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(img, 0, 0, null);
        g.drawImage(remoteController, remoteControllerX, remoteControllerY, null);
        Toolkit.getDefaultToolkit().sync();
        button.paintIcon(buttonTrigger, g, buttonX, buttonY);
    }
    Action paintTimer = new AbstractAction() {
        private static final long serialVersionUID = -2121714427110679013L;

        public void actionPerformed(ActionEvent e) {
            buttonTrigger = null;
            repaint();
        }
    };
}

您还需要这 3 张图片才能运行代码:

http://ajks.pl/graveyard/close_0.jpg

http://ajks.pl/graveyard/pilot.png

http://ajks.pl/graveyard/button.gif

它们被放置在主 Java 项目下的图形文件夹中。

【问题讨论】:

  • 请问 button.paintIcon(...) 的原因是什么
  • 缺少 3 个图形文件,“graphics/button.gif”、“graphics/close_0.jpg”和“graphics/pilot.png”。您的代码不可运行。
  • @mKorbel 使用paintIcon 绘制它比使用drawImage 更容易。
  • ImageIcon button = new ImageIcon("graphics/button.gif"); 永远不会在您的代码中使用,然后永远不会显示,例如 ??? IconJLabel.setIcon(button) ???,不同意 it was easier to draw it with paintIcon than drawImage.,我
  • 终于让你的代码运行起来了。现在,应该发生什么没有发生,用英语而不是 Java?

标签: java swing timer


【解决方案1】:

我添加了一个布尔值来确定是否绘制漩涡状图像图标。

这是更正后的代码。

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame("random title");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }

}

class MyPanel extends JPanel {
    private static final long   serialVersionUID    = 1L;
    public boolean              paintButton         = true;
    public int                  x;
    public int                  y;
    public int                  remoteControllerX   = 473;
    public int                  remoteControllerY   = 340;
    public int                  buttonX             = 166;
    public int                  buttonY             = 208;
    Image                       img;
    Image                       remoteController;
    ImageIcon                   button              = new ImageIcon(
                                                            "graphics/button.gif");
    Component                   buttonTrigger       = this;

    public MyPanel() {
        try {
            img = ImageIO.read(new File("graphics/close_0.jpg"));
            remoteController = ImageIO.read(new File("graphics/pilot.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        setBorder(BorderFactory.createLineBorder(Color.black));

        new Timer(3000, paintTimer).start();

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                // Here goes action on background, which is unrelated to this
                // example.
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(1048, 484);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(img, 0, 0, null);
        g.drawImage(remoteController, remoteControllerX, remoteControllerY,
                null);
        Toolkit.getDefaultToolkit().sync();
        if (paintButton) {
            button.paintIcon(buttonTrigger, g, buttonX, buttonY);
        }
    }

    Action  paintTimer  = new AbstractAction() {
        private static final long   serialVersionUID    = -2121714427110679013L;

        @Override
        public void actionPerformed(ActionEvent e) {
            paintButton = false;
            repaint();
        }
    };

}

【讨论】:

  • 如果我想每 3 秒更改一次漩涡图标的位置怎么办?制作几个带参数的计时器(3000,6000 等)并为每个计时器单独监听?
  • 好的。创建一个定义、定位和绘制漩涡图标的类。阅读本文以更好地了解如何将 Java Swing 应用程序组合在一起。 java-articles.info/articles/?p=196
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2013-12-25
相关资源
最近更新 更多