2013-12-23 8 views
0

Я пытаюсь узнать, как сделать графическую программу, но некоторые из методов в java AWT дают мне неожиданные результаты.AWT графика, объект исчезает ненадолго

Я сделал окно, и я поместил прямоугольник, и это работает. Я хочу, чтобы еще одна фигура, круг, появилась через 1 секунду. Я пробовал метод wait (x), который сразу же помещает круг, и теперь я попробовал метод Thread.sleep (x), который работает, но я получаю следующее поведение:

Через одну секунду, кружок отображается на экране, но после секундной паузы он снова исчезает, а через секунду он снова появляется и остается на экране. Я не хочу, чтобы он временно исчезал. Что я делаю не так?

import java.awt.*; 

class Example extends Canvas{ 

    public static void main(String[] args){ 
     Example graphicProgram = new Example(); 
     Frame graphics = new Frame(); 
     graphics.setSize(300, 300); 
     graphics.add(graphicProgram); 
     graphics.setVisible(true); 
    } 

    public Example(){ 
     setSize(200, 200); 
     setBackground(Color.white); 
    } 

    public void paint(Graphics g){ 
     g.fillRect(20, 150, 100, 100); 
     try{ 
      Thread.sleep(1000); 
     } catch (Exception ex){ 
     } 
     g.fillOval(150, 20, 100, 100); 
    } 
} 

ответ

2

положить эту линию в качестве первого даного в вашем методе рисования super.paint(g);

будет хорошо поместить также Graphics2D g2 = (Graphics2D)g; после выше даного использовать улучшенную производительность и дополнительные методы, предлагаемые Graphics2D

3
  1. Никогда Вызов Thread.sleep изнутри метода краски. Это сделает ваш GUI полностью невосприимчивым.
  2. Да, действительно вызывайте метод супер-покраски из вашего метода рисования (согласно ответу мухаммада).
  3. Вы не должны вызывать Thread.sleep(...) из потока событий, так как это также заморозит ваше приложение.
  4. Вам следует пропустить AWT и перейти на Swing.
  5. Когда вы это сделаете, сделайте свой чертеж в методе paintComponent(Graphics g) объекта JComponent или JPanel.
  6. Позвоните супер paintComponent(g) в пределах вашего paintComponent метод переопределения.
  7. Используйте таймер Swing для любой задержки или анимации.

например,

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Stroke; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class DrawFoo extends JPanel { 

    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private static final Stroke BASIC_STROKE = new BasicStroke(3f); 
    private static final Color RECT_COLOR = Color.blue; 
    private static final Color OVAL_COLOR = Color.red; 
    private boolean drawCircle = false; 
    private int rectX = 20; 
    private int rectY = 150; 
    private int rectWidth = 100; 

    public DrawFoo() { 
     int delay = 1000; 
     Timer timer = new Timer(delay, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      drawCircle = true; 
      repaint(); 
     } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setStroke(BASIC_STROKE); 
     g2.setColor(RECT_COLOR); 
     g.fillRect(rectX, rectY, rectWidth, rectWidth); 
     if (drawCircle) { 
     g2.setColor(OVAL_COLOR); 
     g.fillOval(rectY, rectX, rectWidth, rectWidth); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("DrawFoo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new DrawFoo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
Смежные вопросы