AWT图形,对象短暂消失

时间:2013-12-23 15:02:03

标签: java graphics awt paint thread-sleep

我正在尝试学习如何制作图形程序,但是Java 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 个答案:

答案 0 :(得分:3)

  1. 从不从paint类型的方法中调用Thread.sleep。这样做会使您的GUI完全没有响应。
  2. 是的,请在你的绘画方法中调用超级绘画方法(根据穆罕默德的回答)。
  3. 您不应该从事件线程中调用Thread.sleep(...),因为这也会冻结您的应用程序。
  4. 你应该跳过做AWT并转移到Swing。
  5. 执行此操作时,请使用JComponent或JPanel对象的paintComponent(Graphics g)方法进行绘制。
  6. paintComponent(g)方法覆盖中调用超级paintComponent
  7. 使用Swing Timer进行任何延迟或动画。

  8. 如,

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

答案 1 :(得分:2)

将此行作为绘制方法super.paint(g);

中的第一个参数

最好在上述法规之后放置Graphics2D g2 = (Graphics2D)g;以使用Graphics2D提供的改进性能和额外方法