我正在尝试学习如何制作图形程序,但是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);
}
}
- 切勿从绘制类型的方法中调用 Thread.sleep。这样做会使您的 GUI 完全无响应。
- 是的,請從你的繪畫方法中稱呼超幹底畫方法(根據穆罕默德的回答)。
- 也不应从事件线程调用
Thread.sleep(...)
,因为这也会冻结应用程序。 - 您应该跳过执行 AWT 并转到 Swing。
- 执行此操作时,请在 JComponent 或 JPanel 对象的
paintComponent(Graphics g)
方法中进行绘制。 - 在
paintComponent
方法重写中调用超级paintComponent(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();
}
});
}
}
将此
行作为绘制方法中的第一个语句super.paint(g);
上述语句之后放置Graphics2D g2 = (Graphics2D)g;
以使用Graphics2D提供的改进性能和额外方法