Java 在Eclipse中使用处理制作不同的屏幕
我在使用过程(或eclipse中的处理)时遇到了一些问题。我想让它在一节课上开始,在另一节课上画所有的东西。这是我的密码: 类别“Class1”: 类别“类别2”: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
当我尝试从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,编辑了我的答案以包含代码示例。