Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AWT图形,对象短暂消失_Java_Graphics_Awt_Paint_Thread Sleep - Fatal编程技术网

Java AWT图形,对象短暂消失

Java AWT图形,对象短暂消失,java,graphics,awt,paint,thread-sleep,Java,Graphics,Awt,Paint,Thread Sleep,我正在尝试学习如何制作一个图形程序,但是JavaAWT中的一些方法给了我意想不到的结果 我已经做了一个窗口,我放置了一个矩形,这是可行的。我想要另一个图形,一个圆圈,在1秒后出现。我尝试了wait(x)方法,它只是立即放置圆,现在我尝试了Thread.sleep(x)方法,它确实有效,但是我得到了以下行为: 一秒钟后,圆圈显示在屏幕上,但一秒钟后它再次消失,一秒钟后它再次出现并停留在屏幕上。我不想让它暂时消失。我做错了什么 import java.awt.*; class Example ex

我正在尝试学习如何制作一个图形程序,但是JavaAWT中的一些方法给了我意想不到的结果

我已经做了一个窗口,我放置了一个矩形,这是可行的。我想要另一个图形,一个圆圈,在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); 
    }
}

将这一行作为绘制方法的第一个位置
super.paint(g)


也可以放置
Graphics2D g2=(Graphics2D)g在上述状态之后,要使用Graphics2D提供的改进性能和额外方法,请将此行作为绘制方法中的第一个状态
super.paint(g)

也可以放置
Graphics2D g2=(Graphics2D)g在上述陈述之后,使用Graphics2D提供的改进性能和额外方法

  • 从不从绘制类型的方法中调用Thread.sleep。这样做会使GUI完全没有响应
  • 是的,一定要从你的绘画方法中调用超级绘画方法(根据穆罕默德的回答)
  • 您不应该从事件线程调用
    Thread.sleep(…)
    ,因为这也会冻结您的应用程序
  • 你应该跳过AWT,转到Swing
  • 执行此操作时,请使用JComponent或JPanel对象的
    paintComponent(Graphics g)
    方法进行绘图
  • paintComponent
    方法覆盖中调用super的
    paintComponent(g)
  • 使用摆动计时器执行任何延迟或动画

  • e、 g

  • 从不从绘制类型的方法中调用Thread.sleep。这样做会使GUI完全没有响应
  • 是的,一定要从你的绘画方法中调用超级绘画方法(根据穆罕默德的回答)
  • 您不应该从事件线程调用
    Thread.sleep(…)
    ,因为这也会冻结您的应用程序
  • 你应该跳过AWT,转到Swing
  • 执行此操作时,请使用JComponent或JPanel对象的
    paintComponent(Graphics g)
    方法进行绘图
  • paintComponent
    方法覆盖中调用super的
    paintComponent(g)
  • 使用摆动计时器执行任何延迟或动画

  • e、 g

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