为什么我的JFrame只是一个黑色的窗口?(Why is my JFrame just a blac

2019-10-28 16:01发布

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

感谢您的任何反馈。 它应该打印出来的图片,并最终让它动。

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

Answer 1:

这最可能的原因是你块中的事件指派线程,防止它画...

for(int i=0; i <40; i++)
{
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    model.count();
    model.update();
    panel.repaint();
}

看看在Swing并发和如何使用SwingTimer ,然后做一个搜索动画摆在谷歌更多的建议...



Answer 2:

我强烈建议对静的主方法中的编码,而使用Java的挥杆框架。

一个更好的布局(但不会解决你的问题)是:

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 /事件模型,或创建一个新的线程来处理你的处理代码。 见并发教训关于在Java中使用线程的基本知识一个很好的介绍。



文章来源: Why is my JFrame just a black window?