Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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 在Eclipse中使用处理制作不同的屏幕_Java_Eclipse_Processing - Fatal编程技术网

Java 在Eclipse中使用处理制作不同的屏幕

Java 在Eclipse中使用处理制作不同的屏幕,java,eclipse,processing,Java,Eclipse,Processing,我在使用过程(或eclipse中的处理)时遇到了一些问题。我想让它在一节课上开始,在另一节课上画所有的东西。这是我的密码: 类别“Class1”: 类别“类别2”: 当我尝试从Class1运行程序时,控制台中会显示: Exception in thread "Animation Thread" java.lang.NullPointerException at processing.core.PApplet.background(PApplet.java:15122) at C

我在使用过程(或eclipse中的处理)时遇到了一些问题。我想让它在一节课上开始,在另一节课上画所有的东西。这是我的密码:

类别“Class1”:

类别“类别2”:


当我尝试从Class1运行程序时,控制台中会显示:

Exception in thread "Animation Thread" java.lang.NullPointerException
    at processing.core.PApplet.background(PApplet.java:15122)
    at Class2.draw(Class2.java:6)
    at Class1.draw(Class1.java:11)
    at processing.core.PApplet.handleDraw(PApplet.java:2386)
    at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:240)
    at processing.core.PApplet.run(PApplet.java:2256)
    at java.lang.Thread.run(Unknown Source)

你能告诉我为什么会出现这个,为什么不起作用吗?

粗略地说,你应该只有一个PApplet。它获取对绘图上下文(如画布)的控制并拥有它。在draw方法中,它在画布上绘制您想要的所有内容,除非您明确地将画布传递到其他地方,否则它将无法在画布上绘制。发生此错误是因为第二个PApplet类请求在画布上绘制,而原始PApplet不期望或不允许这样做

我建议您不要在每个draw方法中实例化类Class2,即每秒60次(或其他次数),您将创建一个新对象。相反,考虑这种方法:

import processing.core.PApplet;
public class Class1 extends PApplet {
    Class2 changeClass;

    public void setup() {
        size(600,600);
        changeClass = new Class2();
    }   

    public void draw() {
        background(0);
        changeClass.draw();
    }
}
现在,这是不够的,因为changeClass draw方法将不会收到足够的信息来自行绘制。它需要那块帆布

做你想做的事情的正确方法可能是使用“handleDraw”或“registerMethod”。看起来它们的设计目的是让您指定另一个对象来处理图形(或指定一个库来处理图形)

最后,它可能不符合犹太教,但您可以将绘图上下文作为PGraphics对象获取,并将其传递给您的绘图方法,然后直接将所有内容绘制到该方法,但使用上面提供的方法可能更干净

编辑:根据请求添加快速代码示例。 恐怕我再也没有Eclipse或Proclip了,但希望这个处理示例很容易移植:

void setup()
{
  size(800, 600, OPENGL);
  // Register the Drawer Object as the method to call "draw" on after the PApplet draw is called
  registerMethod("draw", new Drawer());

  // States set here will apply to both draw methods
  rectMode(CENTER);
}

void draw()
{
    // This happens first...
    background(255, 255, 255);
    // More drawing if need be...              
}

public class Drawer
{ 
  void draw()
  {
    // This happens second (every draw)
    translate(width/2, height/2);
    rect(0, 0, frameCount, frameCount);
    // more drawing if need be...
  }
}

粗略地说,你应该只有一个丘疹。它获取对绘图上下文(如画布)的控制并拥有它。在draw方法中,它在画布上绘制您想要的所有内容,除非您明确地将画布传递到其他地方,否则它将无法在画布上绘制。发生此错误是因为第二个PApplet类请求在画布上绘制,而原始PApplet不期望或不允许这样做

我建议您不要在每个draw方法中实例化类Class2,即每秒60次(或其他次数),您将创建一个新对象。相反,考虑这种方法:

import processing.core.PApplet;
public class Class1 extends PApplet {
    Class2 changeClass;

    public void setup() {
        size(600,600);
        changeClass = new Class2();
    }   

    public void draw() {
        background(0);
        changeClass.draw();
    }
}
现在,这是不够的,因为changeClass draw方法将不会收到足够的信息来自行绘制。它需要那块帆布

做你想做的事情的正确方法可能是使用“handleDraw”或“registerMethod”。看起来它们的设计目的是让您指定另一个对象来处理图形(或指定一个库来处理图形)

最后,它可能不符合犹太教,但您可以将绘图上下文作为PGraphics对象获取,并将其传递给您的绘图方法,然后直接将所有内容绘制到该方法,但使用上面提供的方法可能更干净

编辑:根据请求添加快速代码示例。 恐怕我再也没有Eclipse或Proclip了,但希望这个处理示例很容易移植:

void setup()
{
  size(800, 600, OPENGL);
  // Register the Drawer Object as the method to call "draw" on after the PApplet draw is called
  registerMethod("draw", new Drawer());

  // States set here will apply to both draw methods
  rectMode(CENTER);
}

void draw()
{
    // This happens first...
    background(255, 255, 255);
    // More drawing if need be...              
}

public class Drawer
{ 
  void draw()
  {
    // This happens second (every draw)
    translate(width/2, height/2);
    rect(0, 0, frameCount, frameCount);
    // more drawing if need be...
  }
}

如果您使用的是eclipse,那么必须有一个类似以下内容的
main()
方法:

public static void main(String args[]){
    PApplet.main(new String[] {"Class1"});
}
要使用另一个
PApplet
,还必须调用其主函数:

public static void main(String args[]){
    PApplet.main(new String[] {"Class1"});
    PApplet.main(new String[] {"Class2"});
}
整个事情看起来是这样的:

public static void main(String args[]){
    PApplet.main(new String[] {"Class1"});
}
Class1.java

import processing.core.PApplet;

public class Class1 extends PApplet {

    public void setup(){
        size(600, 600);
    }

    public void draw(){
        background(0);
    }

    public static void main(String args[]){
        PApplet.main(new String[] {"Class1"});
        PApplet.main(new String[] {"Class2"});
    }
}
import processing.core.PApplet;

public class Class2 extends PApplet {
    public void draw(){
        background(100);
    }
}
Class2.java

import processing.core.PApplet;

public class Class1 extends PApplet {

    public void setup(){
        size(600, 600);
    }

    public void draw(){
        background(0);
    }

    public static void main(String args[]){
        PApplet.main(new String[] {"Class1"});
        PApplet.main(new String[] {"Class2"});
    }
}
import processing.core.PApplet;

public class Class2 extends PApplet {
    public void draw(){
        background(100);
    }
}

您甚至可以将
main()
函数移动到它自己的文件中。

如果您使用的是eclipse,那么您必须有一个
main()
方法,该方法如下所示:

public static void main(String args[]){
    PApplet.main(new String[] {"Class1"});
}
要使用另一个
PApplet
,还必须调用其主函数:

public static void main(String args[]){
    PApplet.main(new String[] {"Class1"});
    PApplet.main(new String[] {"Class2"});
}
整个事情看起来是这样的:

public static void main(String args[]){
    PApplet.main(new String[] {"Class1"});
}
Class1.java

import processing.core.PApplet;

public class Class1 extends PApplet {

    public void setup(){
        size(600, 600);
    }

    public void draw(){
        background(0);
    }

    public static void main(String args[]){
        PApplet.main(new String[] {"Class1"});
        PApplet.main(new String[] {"Class2"});
    }
}
import processing.core.PApplet;

public class Class2 extends PApplet {
    public void draw(){
        background(100);
    }
}
Class2.java

import processing.core.PApplet;

public class Class1 extends PApplet {

    public void setup(){
        size(600, 600);
    }

    public void draw(){
        background(0);
    }

    public static void main(String args[]){
        PApplet.main(new String[] {"Class1"});
        PApplet.main(new String[] {"Class2"});
    }
}
import processing.core.PApplet;

public class Class2 extends PApplet {
    public void draw(){
        background(100);
    }
}

您甚至可以将
main()
函数移动到它自己的文件中。

只需添加到已经很好的答案中:另一个选项可能是传递对草图图形的引用,以便第二个类可以绘制到:

import processing.core.PApplet;
import processing.core.PGraphics;


public class Class1 extends PApplet {

    Class2 changeClass = new Class2();

    public void setup() {
        size(600,600);
    }   

    public void draw() {
        background(0);
        changeClass.draw(g);
    }

    public static void main(String[] args) {
        PApplet.main(Class1.class.getCanonicalName());
    }

}
class Class2{

    public void draw(PGraphics g) {
        g.background(100);
    }

}

除了已经很好的答案之外:另一个选项可以是传递对草图图形的引用,以便第二个类可以绘制:

import processing.core.PApplet;
import processing.core.PGraphics;


public class Class1 extends PApplet {

    Class2 changeClass = new Class2();

    public void setup() {
        size(600,600);
    }   

    public void draw() {
        background(0);
        changeClass.draw(g);
    }

    public static void main(String[] args) {
        PApplet.main(Class1.class.getCanonicalName());
    }

}
class Class2{

    public void draw(PGraphics g) {
        g.background(100);
    }

}

我理解你所说的错误产生的原因,并为此感谢你。但通过使用“handleDraw”或“registerMethod”,我仍然无法允许Class2绘制。如果可以,请给我一个例子和/或它们的工作方式。谢谢。没问题@Nikpie7,编辑了我的答案,加入了代码示例。我理解你所说的错误原因,谢谢你。但通过使用“handleDraw”或“registerMethod”,我仍然无法允许Class2绘制。如果可以,请给我一个例子和/或它们的工作方式。谢谢。没问题@Nikpie7,编辑了我的答案以包含代码示例。