【问题标题】:Why is my JFrame just a black window?为什么我的 JFrame 只是一个黑色窗口?
【发布时间】:2014-02-27 02:16:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: java swing jframe jpanel jcomponent


    【解决方案1】:

    这最可能的原因是您阻止了事件调度线程,阻止它绘制...

    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 以获得更多建议...

    【讨论】:

      【解决方案2】:

      我强烈建议不要在使用 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 模型,或者创建一个新线程来处理您的处理代码。请参阅concurrency lesson,了解在 Java 中使用线程的基础知识。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 2015-05-12
      • 2021-01-07
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多