【发布时间】:2015-06-17 21:48:12
【问题描述】:
我对 Swing 很陌生,我遇到了一个问题,即我的 JFrame 中没有显示图形。我应该看到的是一个蓝色的矩形在框架中缓慢向下移动,后面是一个纯白色的背景。然而,当我运行我的主类时,我看到的只是一个普通的 JFrame。这是我的代码:
Execute类
public class Execute {
public static void main (String[ ] args) {
GUI gui = new GUI();
gui.createFrame(800,600);
ElevatorOne e1 = new ElevatorOne();
e1.addElevatorOne();
}
}
ElevatorOne 类(应该在哪里初始化和添加图形)
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class ElevatorOne extends GUI{
int y = 100;
public void addElevatorOne() {
drawElevatorOne drawE1 = new drawElevatorOne();
frame.getContentPane().add(drawE1);
for(int i = 0; i < 130; i++) {
y++;
drawE1.repaint();
try {
Thread.sleep(50);
} catch (Exception ex) { }
}
}
@SuppressWarnings("serial")
class drawElevatorOne extends JPanel{
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLUE);
g.drawRect(200,y,40,60);
}
}
}
最后,我的GUI 类(创建frame 的地方)
导入 javax.swing.JFrame;
public class GUI {
JFrame frame = new JFrame();
public void createFrame(int x, int y) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
frame.setSize(x, y);
}
}
【问题讨论】:
-
您的 addElevatorOne 可能会阻塞 EDT,这意味着我只会在短暂延迟后绘制最后一个位置。考虑使用 Swing Timer 来代替动画。您还违反了绘画链,这可能会导致绘画伪影和其他怪异现象,请确保在进行任何自定义绘画之前调用 super.paintComponent
-
1) 添加组件(并调用pack)之前框架可见。 2) 使用基于 Swing 的
Timer在 GUI 中制作动画。不要阻塞 EDT(事件调度线程)。发生这种情况时,GUI 将“冻结”。有关详细信息和修复,请参阅 Concurrency in Swing。 -
挥杆计时器中的@MadProgrammer,我会在每次重复时调用
repaint()方法吗?