[英]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方法对状态做出反应。 一些建议:
actionPerformed
方法中,将applet的布尔字段(blink)更改为相反的状态: blink = !blink;
repaint()
。 这将告诉JVM可能重新绘制小程序。 paint(...)
方法中,在if块中使用眨眼变量的状态,如果为true则绘制眼睛,如果为false则绘制闭合的眼睛。 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();
}
};
}
请参阅执行自定义绘画 。 小程序或框架将是相同的基本过程。
Panel
/ JPanel
)添加到顶层容器。 paint(..)
AWT或paintComponent(..)
Swing方法。 super..
作为第一个语句。 可以使用基于Swing的计时器来实现动画。
当然,我倾向于将步骤1)到4)替换为在JLabel
/ ImageIcon
显示的BufferedImage
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.