显示图像所以我试图显示一个图像(ball
),我最终将控制用户输入。要知道,图像只是使用线程的睡眠方法在间隔内显示。使用EventDispatchThread vs
我做了2班,一个扩展JPanel
和其他扩展JFrame
。 的JPanel
子类看起来是这样的:
public class BallPanel extends JPanel {
private Image ball;
private int x,y;
public BallPanel(){
try {
ball=ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\ball.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
x=10;
y=10;
Thread thread = new Thread() {
@Override
public void run(){
loop();
}
};
thread.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(ball,x,y,null);
}
public void loop(){
while(true){
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
在循环方法我称之为sleep
方法,以允许repaint
被称为过间隔。然后,在构造函数中调用loop()
。
的JFrame
子类看起来是这样的:
public class BallFrame extends JFrame {
public BallFrame(){
setVisible(true);
setSize(800,800);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(new BallPanel());
}
public static void main(String args[]){
//SwingUtilities.invokeLater(new Runnable() {
// @Override
// public void run() {
new BallFrame();
// }
//});
}
}
现在有趣的,或者是令人困惑的事情是,当我运行的代码,因为它是在这里显示,与注释掉的匿名内部类,球并不总是出现。有时我需要在显示球之前重新调整帧的大小(例如,调用repaint
)。但是,当我通过使用匿名内部类的调度线程调用它时,每次运行代码时都会出现球。这是什么原因?
1)见[检测/修复一个代码块的吊闭括号](http://meta.stackexchange.com/q/251795/ 155 831)对于一个问题,我不能再纠缠于此。 2)为了更快地获得更好的帮助,请发布[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)或[SSCCE](http://www.sscce.org/)(简称,自包含,正确的例子)。 3)例如获取图像的一种方法是热链接到[本问答](http://stackoverflow.com/q/19209650/418556)中看到的图像。 –