为什么我的JFrame只是一个黑色的窗口?

时间:2014-02-27 02:16:14

标签: java swing jframe jpanel jcomponent

我的代码是这样的,当我运行它时,我只是得到一个黑色的窗口,我不知道为什么。

感谢您的任何反馈。 它应该打印出一张照片,最终让它移动。

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();
        }
    }
}

2 个答案:

答案 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 SwingHow 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