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