繁体   English   中英

Java applet的“ paint()”中“ Graphics g”的值是什么?

[英]What's the value of “Graphics g” in “paint()” for a Java applet?

我是制作Java applet的初学者,而对于我的第一个applet,我使用paint()绘制了一张笑脸。 现在,我想让笑脸眨一下。 我已经设法设置好了计时器并进行了所有设置,但是我需要使用start()方法来启动计时器,而且似乎通过包含其他方法,paint方法不会自行调用。 因此,我假设需要从start()调用paint(),但是问题是我不知道为了使paint()能够正常工作而应该初始化Graphics变量的方式。

社会科学中心

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);
            }
        };
    }
}

您需要计时器来更改applet的状态,建议对其重新粉刷,然后让applet的paint方法对状态做出反应。 一些建议:

  • 将Swing计时器用作计时器
  • 给您的小程序一个非静态的布尔字段,称为眨眼。
  • 在Timer的actionPerformed方法中,将applet的布尔字段(blink)更改为相反的状态: blink = !blink;
  • 然后调用repaint() 这将告诉JVM可能重新绘制小程序。
  • 在您的paint(...)方法中,在if块中使用眨眼变量的状态,如果为true则绘制眼睛,如果为false则绘制闭合的眼睛。
  • 最好使用Swing小程序或JApplet。
  • 如果使用的是JApplet,则将使用JPanel的paintComponent(...)方法(而不是paint方法paintComponent(...)进行绘画。
  • 无论哪种方式,一定要调用父类的方法,在你的画法第一个方法调用,要么super.paint(g)如果在Applet中的paint方法或super.paintComponent(g)如果在JPanel的paintComponent的方法里面。 这使您的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对象,因此您将不得不丢弃当前的代码。

除了眨眼以外,我还希望使用单独的计时器让他的舌头进出。

然后去吧!

这是经过一些更正的代码:

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的计时器来实现动画。

当然,我倾向于将步骤1)到4)替换为在JLabel / ImageIcon显示的BufferedImage

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM