我的代码是这样的,当我运行它时,我只是得到一个黑色的窗口,我不知道为什么。
感谢您的任何反馈。 它应该打印出一张照片,最终让它移动。
package assignment04;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GoLDriver
{
public static void main(String[] args)
{
GoLModel model= new GoLModel();
JFrame frame = new JFrame();
JPanel panel= new JPanel();
panel.setLayout(new BorderLayout());
panel.setPreferredSize(new Dimension(400, 300));
model.initialize();
frame.add(panel);
frame.pack();
frame.setTitle("Game of Life");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GoLComponent component = new GoLComponent(model,15,20,20);
panel.add(component);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
for(int i=0; i <40; i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
model.count();
model.update();
panel.repaint();
}
}
}
答案 0 :(得分:4)
这最可能的原因是你阻止事件调度线程,阻止它绘画......
for(int i=0; i <40; i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
model.count();
model.update();
panel.repaint();
}
查看Concurrency in Swing和How to use SwingTimer,然后在Google上搜索animation in swing以获取更多建议......
答案 1 :(得分:0)
我强烈建议在使用Java的swing框架时不要在静态main方法中进行编码。
更好的布局(但无法解决您的问题)将是:
public class GoLDriver
{
private GoLModel model;
private JFrame frame;
private JPanel panel;
private GoLComponent component;
public GoLDriver() {
model= new GoLModel();
frame = new JFrame();
panel= new JPanel();
panel.setLayout(new BorderLayout());
panel.setPreferredSize(new Dimension(400, 300));
model.initialize();
frame.add(panel);
frame.pack();
frame.setTitle("Game of Life");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
component = new GoLComponent(model,15,20,20);
panel.add(component);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public void startDriver() {
for(int i=0; i <40; i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
model.count();
model.update();
panel.repaint();
}
}
public static void main(String[] args)
{
GoLDriver gld = new GoLDriver();
gld.startDriver();
}
}
鉴于这看起来像是一个类的编码分配,而不是进一步回答,我建议查看MadProgrammer发布的链接。这个重构将有助于使这些链接中的课程更容易实践。
基本的经验法则是,不要将处理代码放在与显示代码相同的线程中。否则,处理代码将阻止显示代码(事件调度线程)像往常一样工作。最好是利用SpringTimer / events模型,或创建一个新线程来处理您的处理代码。有关在Java中使用线程的基础知识的详细介绍,请参阅concurrency lesson。