2015-07-12 36 views
0

我有这样的代码,repaint()方法在无限for循环中如何表现?

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上it.And控制台(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颜色,为什么它不在控制台上打印“Inside paint”?有人可以帮我解决。

回答

2

您正在用无限循环捆绑GUI的事件线程,因此尽管调用了repaint(),但GUI的事件线程无法对其执行操作。考虑使用Swing Timer或后台线程。

例如,用你1890年的Applet的例子继续:

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

更好,也许是使用一个Swing计时器,并执行基本的动画一个Swing例子:

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

注意,在你的代码repaint()正在被调用并正在执行,但绘图管理器无法处理这个,因为它在GUI的事件线程上这样做。如果GUI的事件线程绑定,则不能完成绘画。

更多关于绘画是如何在Swing和AWT做,请阅读Painting in AWT and Swing

+0

@气垫船,我知道我可以通过线程克服这个问题,因为我没有看到秋千yet.But什么是重绘的原因( )没有执行。我不明白你的意思,请你详细说明你的观点。谢谢 –

+1

@RajMalhotra:你错了 - 重绘()被调用并正在执行,但绘图管理器无法因为它在GUI的事件线程上执行此操作。如果GUI的事件线程被捆绑,则不能完成绘画,纯粹而简单。 –

+0

@RajMalhotra:见编辑回答。 –