Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的屏幕上什么都不会画?_Java_Eclipse_Swing_Draw_Paint - Fatal编程技术网

Java 为什么我的屏幕上什么都不会画?

Java 为什么我的屏幕上什么都不会画?,java,eclipse,swing,draw,paint,Java,Eclipse,Swing,Draw,Paint,我正在使用java中的swing开发一个2D平台,目前我正在为游戏开发框架。我正在测试reapaint()和draw函数,但它们不起作用,我对此一无所知。这是我的密码: Window.java import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Window extends JFrame { public Window() { this.setDefaultCloseOperation

我正在使用java中的swing开发一个2D平台,目前我正在为游戏开发框架。我正在测试reapaint()和draw函数,但它们不起作用,我对此一无所知。这是我的密码:

Window.java

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Window extends JFrame {

public Window() {

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setSize(1000, 1000);
    this.setVisible(true);
    this.setTitle("Infiltrator");
    this.setLocationRelativeTo(null);
    this.setContentPane(new Framework());
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() 
    { 
    @Override
    public void run() 
    { new Window(); } 
    }
                                             );

}





}
Panel.java

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public abstract class Panel extends JPanel {

public Panel() {

this.setDoubleBuffered(true);
this.setFocusable(true);

/*
 * 
if(false)
{
    BufferedImage blankCursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
    Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(blankCursorImg, new Point(0, 0), null);
    this.setCursor(blankCursor);
}
*
*/
}

public static void Draw(Graphics2D g2d) {

}

@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;        
super.paintComponent(g2d);        
Framework.Draw(g2d);    
}

}
Framework.java

import java.awt.Color;
import java.awt.Graphics2D;

import javax.swing.JFrame;

public class Framework extends Panel {

private static long beginTime, takenTime, sleepTime;
private static long secInNano = 1000000000L;
private static long secInMilli = 1000000L;
private static long fps = 60L;
private static long fpsTime = secInNano / fps;

public static enum GameState {STARTING, MAINMENU, PLAYING, OVER};
public static GameState gameState;

public Framework ()
{
    super();

    Thread gameThread = new Thread() {
        @Override
        public void run(){
            mainLoop();
        }
    };

    gameState = GameState.STARTING;

    gameThread.start();
}

private void mainLoop() {

    while (gameState != GameState.OVER) {

        beginTime = System.nanoTime();

        switch (gameState) {
            case STARTING:  
                LoadandInit();
                break;
            case MAINMENU: 
                MainMenu.Update();
                break;
            case PLAYING: 

                break;
            default:
                System.out.println("Ok, somebody messed up.");
                break;

        }

        repaint();

        takenTime = System.nanoTime() - beginTime;
        sleepTime = (fpsTime - takenTime) / secInMilli;
        if (sleepTime < 10)
            sleepTime = 10;

        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException ex) { }


    }


}



private static void LoadandInit() {

    gameState = GameState.MAINMENU;
}


public static void Draw(Graphics2D g2d) {

        g2d.setColor(Color.BLACK);
        g2d.drawString("DEARP", 0, 0);
}
导入java.awt.Color;
导入java.awt.Graphics2D;
导入javax.swing.JFrame;
公共类框架扩展面板{
私人静长的开始时间、休息时间、睡眠时间;
专用静态长secInNano=1000000000L;
专用静态长secInMilli=100000ml;
专用静态长fps=60L;
专用静态长fps时间=secInNano/fps;
公共静态枚举游戏状态{开始,主菜单,播放,结束};
公共静态博弈状态;
公共框架()
{
超级();
线程gameThread=新线程(){
@凌驾
公开募捐{
mainLoop();
}
};
gameState=gameState.STARTING;
gamesthread.start();
}
私有void mainLoop(){
while(gameState!=gameState.OVER){
beginTime=System.nanoTime();
开关(游戏状态){
案件开始:
LoadandInit();
打破
案例主菜单:
main menu.Update();
打破
案例分析:
打破
违约:
System.out.println(“好吧,有人搞砸了。”);
打破
}
重新油漆();
takenTime=System.nanoTime()-beginTime;
睡眠时间=(fpsTime-takenTime)/secInMilli;
如果(睡眠时间<10)
睡眠时间=10;
试一试{
睡眠(睡眠时间);
}catch(InterruptedException ex){}
}
}
私有静态void LoadandInit(){
gameState=gameState.main菜单;
}
公共静态空心图(Graphics2D g2d){
g2d.setColor(Color.BLACK);
g2d.抽绳(“DEARP”,0,0);
}

}

我推荐Java杀手游戏编程的第2章。您可以在本书的网站上阅读本章的草稿:


您正在将框架实例添加到窗口中,但框架不会覆盖paintCompontents。它有一个由Panel调用的静态绘制方法,但您从未创建Panel的实例

您可以将Draw方法转换为paintComponent(),并删除您的Panel类


此外,您不应该在框架的构造函数中启动线程。这可能会导致run方法看到成员变量的不正确值。创建一个新的启动线程的启动方法。

静态方法/变量太多,我无法理解发生了什么。使用静态通常意味着一个设计问题。我建议您从上的Swing教程开始学习基础知识。它是否属于无限循环?尝试从
paintComponent
实现中删除
super.paingComponent()
。@antoniosss,您应该始终调用super.paintComponent(),以确保面板的背景已绘制。它不会导致循环。链接不是答案。充其量,这只是一个评论。我想,任何好事都会受到惩罚。这一章长达27页,我无法在回答中总结。如果这是作为评论发布的,我会投它一票。但是,你不需要总结整个事情。OP有一个特定的问题;不需要一整本书(甚至一整章)来解释这个问题是什么。你投票反对提供一个相关链接,为他们提供一个高质量的动画框架,并解释该框架是如何工作的?我保留对完全错误或误导性的信息的否决票。我希望您想编写
paintComponent()
:-)