repaint()方法如何在无限for循环中表现?

时间:2015-07-12 17:53:04

标签: java applet paint repaint

我有这段代码,

import java.awt.*;
import java.applet.*;
public class FirstApplet extends Applet 
{
    int len;
    char ch;
    String msg="Hello World ";
    public void init()
    {
        setBackground(Color.CYAN);
        setForeground(Color.WHITE);
    }
    public void start()
    {
        System.out.println("Inside Start");
        repaint();
    }
    public void paint(Graphics g)
    {
        System.out.println("Inside paint");
        g.drawString(msg,200,200);
    }
}

它输出一个带有Hello World的CYAN彩色背景。在控制台(cmd)上输出 -

  

内部开始

     

内部油漆

现在如果我将代码修改为 -

import java.awt.*;
import java.applet.*;
public class FirstApplet extends Applet 
{
    String msg="Hello World ";
    int len;
    char ch;
    public void init()
    {
        setBackground(Color.CYAN);
        setForeground(Color.WHITE);
    }
    public void start()
    {
        System.out.println("Inside Start");
        for(;;)
        {
            repaint();
        }
    }
    public void paint(Graphics g)
    {
        System.out.println("Inside paint");
        g.drawString(msg,200,200);
    }
}

它输出一个白色的屏幕,上面没有文字,在控制台上只输出 -

  

内部开始

我无法理解第二个程序的输出,虽然我每次都在for循环中调用repaint()但为什么applet窗口的颜色不会改变为CYAN颜色以及为什么它不打印&#34 ;内部涂料"在控制台上?有人可以帮帮我吗。

1 个答案:

答案 0 :(得分:2)

你正在使用无限循环来绑定GUI的事件线程,因此尽管调用了@echo off Command.Com ,但GUI的事件线程无法对其进行操作。请考虑使用Swing Timer或后台线程。

例如,继续使用1890的Applet示例:

repaint()

更好的是使用Swing Timer并执行基本动画的Swing示例:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.*;

public class PaintEg extends Applet {
   String msg = "Hello World ";
   int len;
   char ch;

   public void init() {
      setBackground(Color.CYAN);
      setForeground(Color.WHITE);
   }

   public void start() {
      System.out.println("Inside Start");
      new Thread(new Runnable() {
         public void run() {
            for (;;) {
               repaint();
               try {
                  Thread.sleep(10);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
            }
         }
      }).start();
   }

   public void paint(Graphics g) {
      System.out.println("Inside paint");
      g.drawString(msg, 10, 20);
   }
}

请注意,在您的代码import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class PaintEg2 extends JPanel { private static final int PREF_W = 400; private static final int PREF_H = PREF_W; private static final int TIMER_DELAY = 30; private String msg = "Hello World "; private int msgX = 0; private int msgY = 0; public PaintEg2() { setBackground(Color.CYAN); setForeground(Color.WHITE); setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); new Timer(TIMER_DELAY, new TimerListener()).start(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawString(msg, msgX, msgY); } @Override public Dimension getPreferredSize() { if (isPreferredSizeSet()) { return super.getPreferredSize(); } return new Dimension(PREF_W, PREF_H); } private class TimerListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { msgX++; msgY++; repaint(); } } private static void createAndShowGui() { PaintEg2 mainPanel = new PaintEg2(); JFrame frame = new JFrame("PaintEg2"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 被调用并且正在执行,但是绘制管理器无法对此进行操作,因为它在GUI的事件线程上执行此操作。如果GUI的事件线程被绑定,则无法进行绘制。

有关如何在Swing和AWT中完成绘画的更多信息,请阅读Painting in AWT and Swing