AWT图形,对象短暂消失



我正在尝试学习如何制作图形程序,但是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); 
    }
}
  1. 切勿从绘制类型的方法中调用 Thread.sleep。这样做会使您的 GUI 完全无响应。
  2. 是的,請從你的繪畫方法中稱呼超幹底畫方法(根據穆罕默德的回答)。
  3. 也不应从事件线程调用Thread.sleep(...),因为这也会冻结应用程序。
  4. 您应该跳过执行 AWT 并转到 Swing。
  5. 执行此操作时,请在 JComponent 或 JPanel 对象的paintComponent(Graphics g)方法中进行绘制。
  6. paintComponent 方法重写中调用超级paintComponent(g)
  7. 使用摆动计时器执行任何延迟或动画。

例如,

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

行作为绘制方法中的第一个语句super.paint(g);

最好在

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

相关内容

  • 没有找到相关文章

最新更新