2015-07-12 2 views
0

У меня есть этот код,Как метод 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); 
    } 
} 

Он выводит CYAN цветной фон с Hello World на it.And на консоли (CMD), он outputs-

внутри Запустить

внутри краска

Теперь, если я изменить код this-

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

Он выводит белый цветной экран без текста на нем, и на консоли это просто outputs-

Inside Start

Я не могу понять, выход второй программы, Хотя я все время призываю repaint() внутри цикла for, почему цвет окна апплета не меняется на цвет CYAN и почему его не печатает «Inside paint» на консоли? Может кто-нибудь, пожалуйста, помогите мне.

ответ

2

Вы связываете поток событий GUI с бесконечным циклом, так что, хотя вызывается repaint(), поток событий GUI не может действовать на него. Подумайте, вместо этого используйте таймер Swing или фоновый поток.

Например, и продолжая ваш пример апплета 1890-х:

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, таймер и выполняет основную анимацию:

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 привязан, никакая покраска не может быть выполнена.

Более подробную информацию о том, как рисование происходит в свинг и AWT, пожалуйста, прочитайте Painting in AWT and Swing

+0

@ СВП-я знаю, что могу преодолеть это нить, потому что я не читал Качели yet.But Что причина, что перекрашивать () не выполняется. Извините, я вас не понял. Не могли бы вы рассказать о своей точке. Спасибо –

+1

@RajMalhotra: вы ошибаетесь. 'repaint()' вызывается и выполняется, но менеджер красок не может действуйте по этому поводу, потому что он делает это в потоке событий GUI. Если поток событий GUI привязан, никакая покраска не может быть выполнена, чистая и простая. –

+0

@RajMalhotra: см. Править для ответа. –

Смежные вопросы