这个问题是关于Frames,Java和Processing的。

这个问题听起来很复杂,但实际上并非如此。我将尝试将其保持在最低限度。我正在迷宫游戏中创建一个小球,以使自己对物理和渲染有所了解。到目前为止,这是一个很好的经验,但是我碰到了一些砖墙。
我决定的总体布局是将PApplets包含在AWT框架中并关闭框架。这样做的原因是因为有人告诉我您一次只能使用一个Papplet实例。
PAppletProcessing(呈现库)中的Applet类。

我这里有3节课,包括主要

public class Menu extends PApplet
{
//images and buttons
PImage background, playbtn1, playbtn2, hsbtn1, hsbtn2, abbtn1, abbtn2, exbtn1,     exbtn2;
FBox pBtn, hBtn, eBtn;

FWorld menu;

//simple constructor
public Menu()
{

}

public void setup()
{
    size(600, 400);
    smooth();
    Fisica.init(this);
    menu = new FWorld();

    //loading and placing images
    background = loadImage("MenuAlt.jpg");
    System.out.println(background);
    playbtn1 = loadImage("play1.gif");
    playbtn2 = loadImage("play2.gif");
    hsbtn1 = loadImage("high1.gif");
    hsbtn2 = loadImage("high2.gif");
    exbtn1 = loadImage("exit1.gif");
    exbtn2 = loadImage("exit2.gif");

    //loading and placing buttons
    pBtn = new FBox(120, 150);
    pBtn.setPosition(135, 215);
    pBtn.setDrawable(false);
    hBtn = new FBox(120, 150);
    hBtn.setPosition(295, 215);
    hBtn.setDrawable(false);
    eBtn = new FBox(120, 150);
    eBtn.setPosition(455, 215);
    eBtn.setDrawable(false);

    //add item to world
    menu.add(pBtn);
    menu.add(hBtn);
    menu.add(eBtn);
}

public void draw()
{
    image(background, 0, 0);
    image(playbtn1, 80, 140);
    image(hsbtn1, 237, 135);
    image(exbtn1, 400, 140);

    mouseOver();
    menu.draw();
}

//close this frame an open a new level, high score or exit
//depending on what the use clicks
public void mousePressed()
{
    FBody pressed = menu.getBody(mouseX, mouseY);
    if (pressed == pBtn)
    {
        System.out.println("play game");
        this.getParent().getParent().getParent().getParent().setVisible(false);

        ExampleFrame x = new ExampleFrame(new Level("level1.txt"));
        x.setLocation(this.getParent().getParent().getParent().getParent().getLocation());
    }
    if (pressed == hBtn)
    {
        System.out.println("high scores");
        this.getParent().getParent().getParent().getParent().setVisible(false);

        /* these are just for finding the parent
 System.out.println(this.getName());
 System.out.println(this.getParent().getName());
 System.out.println(this.getParent().getParent().getName());
 System.out.println(this.getParent().getParent().getParent().getName());
 System.out.println(this.getParent().getParent().getParent().getParent().getName());
         */
        ExampleFrame x = new ExampleFrame(new HighScores()); //for testing, you can change this to new menu()
        x.setLocation(this.getParent().getParent().getParent().getParent().getLocation());
    }
    if (pressed == eBtn)
    {
        System.out.println("exit");
        System.exit(0);
    }
}

exampleFrame类
public class ExampleFrame extends JFrame
{
    PApplet app;

    public ExampleFrame(PApplet emApp)
    {
        super("Ball Maze Game");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocation(200, 200);

        app = emApp;
        setSize(615,438);
        setVisible(true);

        setLayout(new BorderLayout());

        add(app, BorderLayout.CENTER);
        app.init();
    }
}

主要的
public class Main
{
    public static void main(String[] args)
    {
        ExampleFrame x = new ExampleFrame(new Menu());
    }
}

当mousePressed == ebtn发生时,框架中的所有内容都将被删除,并且将加载高分屏幕。高分与菜单几乎相同。无需发布代码,因为这里足够了。

第二类是充当框架并持有PApplet的类

最重要的是,有谁知道如何从PApplet调用Frame方法,或以另一种方式删除所有PApplets内容并加载另一个PApplet的方法?

最佳答案

为了回答如何从PApplet调用Frame方法? ,我已将您的代码段修改为最低限度。在此修改的版本中,当用户单击鼠标按钮时,会触发System.out

现在,您可以通过两种方式访问​​Frame对象。但是在此之前,我先说两点:

  • 当您创建像new ExampleFrame(new Menu());这样的PApplet并将其添加到JFrame这样的add(app, BorderLayout.CENTER);中时,则会创建复杂的Windows/面板层次结构。

  • 像这样:
    javax.swing.JPanel
        javax.swing.JLayeredPane
            javax.swing.JRootPane
                test.ExampleFrame
    
  • PApplet提供了一个公共(public)字段,用于设置和访问框架对象。令人惊讶的是,它被称为frame :)。您可以在调用app.init();
  • 之前进行设置

    >>代码

    ** check out 代码中的注释**

    修改后的ExampleFrame.java
    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import processing.core.PApplet;
    
    public class ExampleFrame extends JFrame
    {
        private static final long serialVersionUID = 4792534036194728580L;
        PApplet app;
    
        public ExampleFrame(PApplet emApp)
        {
            super("Ball Maze Game");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocation(200, 200);
    
            app = emApp;
            setSize(615,438);
            setVisible(true);
    
            setLayout(new BorderLayout());
    
            add(app, BorderLayout.CENTER);
    
            // Setting my frame object
            app.frame = this;
            app.init();
        }
    
        // Sample Method
        public void sampleMethod(String msg)
        {
            System.out.println("I think '"+ msg +"' called me !!");
        }
    }
    

    修改的Menu.java
    import java.awt.Container;
    
    import processing.core.PApplet;
    import processing.core.PImage;
    
    public class Menu extends PApplet
    {
        private static final long serialVersionUID = -6557167654705489372L;
    
        PImage background;
        static String tab = "";
    
        //simple constructor
        public Menu()
        {
    
        }
    
        public void setup()
        {
            size(600, 400);
            smooth();
    
            background = loadImage("C:/temp/background.jpg");
        }
    
        public void draw()
        {
            image(background, 0, 0);
        }
    
        public void mousePressed()
        {
            Container p = getParent();
            tab = "";
    
            // FIRST WAY OF ACCESSING PARENT FRAME
            while(p != null)
            {
                //printParentTree(p);
                if(p instanceof ExampleFrame)
                {
                    ExampleFrame myframe = (ExampleFrame)p;
                    myframe.sampleMethod("First Way");
                    break;
                }
                p = p.getParent();
            }
    
            // SECOND WAY OF ACCESSING PARENT FRAME
            if(frame != null && (frame instanceof ExampleFrame))
            {
                ExampleFrame myframe = (ExampleFrame)p;
                myframe.sampleMethod("Second Way");
            }
        }
    
        void printParentTree(Container p)
        {
            System.out.println(tab+p.getClass().getName());
            tab +='\t';
        }
    }
    

    checkout public void mousePressed()方法。

    为了完整起见,我还包括Main.java。
    public class Main {
        public static void main(String[] args){
            new ExampleFrame(new Menu());
        }
    }
    

    现在回答删除所有PApplets内容并在中加载另一个PApplet

    好吧,我还没有测试过。但是您可以在JPanel中添加JApplet并在此基础上进行所有绘制,即创建子控件等。当需要重绘时,请调用JPanel.removeAll()。根据javadoc:



    之后,在repaint上调用JPanel。尝试一下,它可能会起作用:)。

    10-06 07:41