如何解决我的JFrame不开放,编译器给了我没有错误,我该如何解决?

时间:2019-01-31 18:41:40

标签: java swing jframe

[技术上不是[重复]],我知道这已经发生过了(有一个错误,我编译游戏时无法打开JFrame,我该如何解决此问题[重复]),MadProgrammer回答:“游戏。 main没做任何事情。因为它是程序的主要切入点,所以它需要做一些事情才可以发生。”但是现在Game.main做了我看不到答案的事情。

我试图重新编译和检查错误,没有,别人即使它得到的工作。我该如何解决

Game.java:

package com.hypopixel;

import java.awt.*;

import javax.swing.*;

import java.applet.*;

public class Game extends Canvas implements Runnable {

    public static final long serialVersionUID = 1L;

    private Thread thread;
    private Boolean running = false;

    public Game() {
        new Window(800, 600, this);
    }

    public synchronized void start() {
        thread = new Thread(this);
        thread.start();
        running = true;
    }
    public synchronized void stop() {
        try {
            thread.join();
            running = false;
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
    }

    public static void main(String[] args) {
        new Game();
    }
}

Window.java:

package com.hypopixel;

import java.awt.*;
import javax.swing.*;
import java.applet.*;

public class Window extends Canvas {

    public static int BlockSizing = 4;

    public static final long serialVersionUID = 1L;

    public Window(int Wwidth, int Wheight, Game game) {
        JFrame Window = new JFrame();
        setPreferredSize(new Dimension(Wwidth, Wheight));
        setMinimumSize(new Dimension(800, 600));
        Window.add(game);
        Window.pack();
        Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Window.setTitle("HypoPixel");
        Window.setLocationRelativeTo(null);
        Window.setVisible(true);
        game.start();
    }
}
/*

Credits:

Just another Java Programmer

MadProgrammer

*/

manifest.txt是相同的

我预期的JFrame开(Cuase别人能得到它),它不会打开。

1 个答案:

答案 0 :(得分:1)

所以,有些事情“不对”

从...开始...

public Window(int Wwidth, int Wheight, Game game) {
    JFrame Window = new JFrame();
    setPreferredSize(new Dimension(Wwidth, Wheight));
    setMinimumSize(new Dimension(800, 600));
    Window.add(game);
    Window.pack();
    Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Window.setTitle("HypoPixel");
    Window.setLocationRelativeTo(null);
    Window.setVisible(true);
    game.start();
}

除了Window中已经存在一个名为java.awt的类而使人困惑的事实之外,您还使用了变量名Window,这使人更加困惑。

Window源自Canvas,但您从未真正使用过它。之所以调用setPreferredSizesetMinimumSize是因为Window实际上从未添加到任何东西,通常建议不要这样做,而建议改写这些方法,以防止意外更改其值。

Game中,您打电话给Window ...这是一种奇怪的处理方式,因为Game并不是真正负责创建窗口,而是反之亦然。

我个人将从一个专用的入口点开始,例如,它的职责是加载和准备环境并显示第一个屏幕...

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Game());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

确保manufest.mfMain-Class属性指向该类。

我还将更新Game,因此它会覆盖getPreferredSize。我还将看看您的startstop方法。

public synchronized void start() {
    thread = new Thread(this);
    thread.start();
    running = true;
}

如果两次调用该怎么办?在创建新Thread之前,您应该先检查public synchronized void stop() { try { thread.join(); running = false; } catch(Exception e) { e.printStackTrace(); } } 的状态。

join

这不会做任何事情,因为running正在阻止,所以running的状态将永远不会改变。

此外,由于Java的内存模型,您可能会发现即使在调用false之前将join设置为Boolean也不起作用。相反,您应该使用atomic variable(并且使用import java.awt.Canvas; import java.awt.Dimension; import java.util.concurrent.atomic.AtomicBoolean; public class Game extends Canvas implements Runnable { public static final long serialVersionUID = 1L; private Thread thread; private AtomicBoolean running = new AtomicBoolean(false); public Game() { } @Override public Dimension getPreferredSize() { return new Dimension(800, 600); } public synchronized void start() { running.set(true); if (thread == null) { thread = new Thread(this); thread.start(); } } public synchronized void stop() { running.set(false); if (thread == null) { return; } try { thread.join(); } catch (Exception e) { e.printStackTrace(); } } public void run() { } } 可能会引起很多其他问题,因为您引用的是内存位置而不是实际值)

我建议您通读Concurrency

Main
  

我使用的IDE(NetBeans)不允许我运行Java文件

从“项目”标签中,选择Main类/ Java文件,右键单击并选择“运行文件”

Run file in netbeans

或者,在编辑器中打开com.hypopixel.Main(并选择),然后按 Shift + F6

接下来,确保将com.hypopixel.Main设置为项目“主类”

  • 右键单击“项目”标签中的项目节点,然后选择“属性”

Properties

  • 从右侧的选项中选择“运行”,确认“主类”设置为fruit="apple" echo $fruit | cut -c1-3 variable=$"{echo $fruit | cut -c1-3}" ,如果未设置,请单击“ 浏览... ”,然后从可用选项

Options