【问题标题】:PaintComponent error油漆组件错误
【发布时间】:2016-06-18 23:18:34
【问题描述】:

我的代码出错:

at javax.swing.JComponent.paintComponent(JComponent.java:783)
at com.game.screen.screen.PaintComponent(screen.java:29)
at com.game.screen.screen.GameScreen(screen.java:39)
at com.game.gamecore.Core.StartGame(Core.java:15)
at com.game.gamecore.Core.main(Core.java:6)

我的代码: com.game.screen

package com.game.screen;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

import javax.swing.*;

public class screen extends JPanel implements ActionListener  {
    /**
     * 
     */
    ActionListener AL = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

        }
    };

    Timer timer = new Timer(5, AL);
    double x = 0, y = 0, velY = 0,velX = 0;


    public void PaintComponent(Graphics pixel){
        super.paintComponent(pixel);
        Graphics2D g2 = (Graphics2D) pixel;
        Ellipse2D circle = new Ellipse2D.Double(x,y,40,40);
        g2.fill(circle);
        timer.start();
    }
    public void GameScreen(){

        JFrame GameScreen = new JFrame("THE GAME");
        GameScreen.setSize(600, 600);
         PaintComponent(null);
        GameScreen.setVisible(true);




    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }

}

com.game.gameCore.Core

package com.game.gamecore;

public class Core {
    public static void main(String[] args) {
    //  new Menu();
    new Core().StartGame(); 
    }

    public void StartGame(){

        String GameState = "idle";

        if(GameState=="idle"){
        GameState="Running";
        new com.game.screen.screen().GameScreen();


        } else if(GameState=="Running") {

            //enter process kill code here

        }
    }
}

如何调用我的 PaintComponent(graphics G) 代码?

需要随机输入一些东西,否则这个东西不会让我发布它...... 我会一直打字直到它停止给我错误...

【问题讨论】:

  • 你不会得到错误,而是异常。 at .. 也指出了与异常有关的位置,但描述为什么抛出异常的主要部分应该在 at.. 部分之前解释。请edit您的问题并发布正确的堆栈跟踪,包括异常消息。
  • 您不应该手动调用paintComponent。我建议reading a tutorial 讨论这个问题。
  • 顺便说一句:if(GameState=="idle") -> How do I compare strings in Java?。我知道您的代码现在可以工作,因为您使用的是文字,但将来当您开始从某些资源(控制台、文件)读取字符串时,或者当您将动态创建新字符串时(例如使用 replace 或 @987654332 @方法)你会看到==会开始让你失望。
  • 困扰我的不是游戏状态或堆栈跟踪,而是我如何称呼该图形。我创建了一个 void 并将我的代码插入到那里,通常你在主类中调用,但现在你需要将它插入到你的 JFrame 中。我的问题是我需要调用什么方法(JFrame 的?

标签: java swing graphics


【解决方案1】:

问题和一些解决方案:

  1. PaintComponent != paintComponent。字符串大小写对 Java 标识符很重要,所以使用正确的,这里是paintComponent
  2. 在您的paintComponent 方法覆盖之前不要使用@Override。如果你这样做了,编译器会指出你的方法不是真正的覆盖,迫使你更仔细地检查你的方法签名以了解原因,你可能会自己发现大小写错误。
  3. 关于if(GameState=="idle"){,不要使用==!= 比较字符串。请改用equals(...)equalsIgnoreCase(...) 方法。了解== 检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,这就是这里的重点。所以改为if ("idle".equals(GameState)) {,或者更好的是,将枚举用于游戏状态,因为这样会更加万无一失。
  4. 您只发布了您的问题的异常堆栈跟踪的一部分,但忽略了关键的开始部分,即告诉您确切抛出什么异常的部分。它是什么? NullPointerException?
  5. re, timer.start(); -- 你在你的paintComponent 方法中调用它,你不应该这样做。您无法完全控制何时或什至何时调用paintComponent,因此不应在此方法中包含更改对象状态的代码。
  6. PaintComponent(null);你直接调用你的绘画方法,你不应该做的事情。如果您想建议 JVM 为您绘制,请致电 repaint()。这就是您的 NullPointerException 的原因(我们现在知道正在发生)。您正在为 Graphics 对象传递一个空引用,然后尝试对其调用方法。不要这样做。

【讨论】:

  • 是的,它是一个 Nullpointer 异常,为什么问题是你能清理我的代码以了解它是如何工作的?因为我不明白你想告诉我游戏状态的事情现在并不重要,因为它永远是空闲的
  • @SvenTjeerdsma:您似乎还不清楚该站点的工作原理,但请理解它不是“请为我清理代码”站点。我们可以帮助回答问题,有时还可以发现错误,但您有责任清理自己的代码,并且尝试不这样做有时会导致您的问题被关闭。仅供参考。请考虑浏览tour 并查看help center 部分以及how to ask good questions 部分。
  • @SvenTjeerdsma:答案已编辑。您需要阅读 Swing 图形教程以了解有关如何进行 Swing 绘画的更多信息:* Lesson: Performing Custom Painting
  • 我知道这个网站是如何运作的,你不明白我的意思。我的问题是要获得一个代码示例,我是一个初级程序员并且不理解所有术语,也许“将其更改为那个”可能比我无法理解的所有解释更有效
  • @SvenTjeerdsma:这正是我的意思。这不是“获取代码示例站点”,而是一个问答站点。再次,请通过上面发布的链接。尽管请注意有很多示例供您查看,但其中很多是我的。 For example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多