1

在制作 Java 小程序方面,我是一个初学者,对于我的第一个小程序,我使用paint() 画了一个笑脸。现在,我想让笑脸闪烁。我已经设法让我的计时器和所有东西都设置好了,但是我需要使用 start() 方法来让计时器运行,而且似乎通过包含其他方法,paint 方法不会调用自身。因此,我假设我需要从 start() 调用paint(),但问题是我不知道我应该将 Graphics 变量初始化为什么以使 paint() 实际工作。

SSCCE

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.event.*; 

public class Project2_15 extends Applet
{   
    public void paint(Graphics g)
    {
setBackground(Color.lightGray);
    }

    // This handles the starting of timer execution.
    public void start()
    {
            Graphics g; // What do I initialize this to?
    paint(g);
    }

    // Timer Stuff
    ActionListener blinkShut;
    public Project2_15(final Graphics g) {
        this.blinkShut = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)       {
                g.setColor(Color.black);
            }
        };
    }
}
4

2 回答 2

3

您需要您的计时器来更改小程序的状态,建议重新绘制它,然后让您的小程序的绘制方法对状态做出反应。一些建议:

  • 为您的计时器使用摇摆计时器
  • 给你的applet 一个叫做blink 的非静态布尔字段。
  • 在 Timer 的actionPerformed方法中,将小程序的布尔字段 blink 更改为相反的状态:blink = !blink;
  • 然后调用repaint()。这将告诉 JVM 可能重新绘制小程序。
  • 在您的paint(...)方法中,在 if 块中使用 blink 变量的状态,如果为真则画一只眼睛,如果为假则画一只闭眼。
  • 最好使用 Swing 小程序或 JApplet。
  • 如果您使用的是 JApplet,那么您将在 JPanel 的paintComponent(...)方法中进行绘画,而不是在绘画方法中。
  • 无论哪种方式,无论super.paint(g)是在Applet 的paint 方法中还是super.paintComponent(g)在JPanel 的paintComponent 方法中,请确保调用super 方法作为您的绘画方法中的第一个方法调用。这允许您的 GUI 删除以前的绘画。

编辑
关于您的代码:

public void start()
{
   Graphics g; // What do I initialize this to?
   paint(g);
}

和:

public Project2_15(final Graphics g) {
    this.blinkShut = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e)       {
            g.setColor(Color.black);
        }
    };
}

请扔掉这段代码,因为您几乎从不以这种方式绘画或直接调用绘画。请阅读或重新阅读我上面的建议。


编辑 2
关于您的评论:

所以我不能只创建一个单独的计时器并将代码放入他们的?

我从来没有说过这个。随意使用单独的计时器,并在其中放入体面的代码。当然,您必须放弃当前的代码,因为您不想像尝试那样直接操作 Graphics 对象。

除了他的眼睛眨眼,我还希望他的舌头能用一个单独的计时器进出。

那就去吧!

于 2013-10-27T00:53:22.090 回答
3

这是带有一些更正的代码:

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.event.*;

public class Project2_15 extends Applet
{

    public boolean wink = false;
    Timer timer;

    public void paint(Graphics g)
    {
        super.paint(g);
        // Graphics g; // What do I initialize this to?  ALREADY INITIALIZED
        //paint(g);
        if (wink) {
            g.drawLine(1,1,100,100);
        } else {
            g.drawOval(1,1,100,100);
        }
    }

    // This handles the starting of timer execution.  NO IT DOES NOT!
    // public void start()
    @Override
    public void init()
    {
        setBackground(Color.lightGray);
        timer = new Timer(250,blinkShut);
    }


    @Override
    public void start() {
        timer.start();
    }

    @Override
    public void stop() {
        timer.stop();
    }
    // Timer Stuff
    ActionListener blinkShut = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            wink = !wink;
            repaint();
        }
    };
}

请参阅执行自定义绘画。这将是与小程序或框架相同的基本过程。

  1. 将容器 ( Panel/ JPanel) 添加到顶级容器。
  2. 覆盖paint(..)AWT 或paintComponent(..)Swing 方法。
  3. 调用super..作为第一个语句。
  4. 对提供的 Graphics 实例进行自定义绘制。

动画可以使用基于 Swing 的 Timer 来实现。

当然,我倾向于将步骤 1) 到 4) 替换为在/BufferedImage中显示的 a 。JLabelImageIcon

于 2013-10-27T01:19:19.243 回答