Java JME 3&x2B;摇摆,多张画布

Java JME 3&x2B;摇摆,多张画布,java,swing,jmonkeyengine,Java,Swing,Jmonkeyengine,我正在使用JME3,目前面临以下问题: 当LWJGL画布包含在应用程序的多个选项卡中时,它们中没有一个或只有1个运行 下面是一个例子: SwingCanvas.java: package jme3test.helloworld; import java.awt.Dimension; import javax.swing.JFrame; import com.jme3.app.SimpleApplication; import com.jme3.material.Material; impor

我正在使用JME3,目前面临以下问题:

当LWJGL画布包含在应用程序的多个选项卡中时,它们中没有一个或只有1个运行

下面是一个例子:

SwingCanvas.java:

package jme3test.helloworld;

import java.awt.Dimension;
import javax.swing.JFrame;

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeCanvasContext;

public class SwingCanvas extends SimpleApplication {

    private void SwingCanvasTest() {
        SwingCanvas app = new SwingCanvas();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        // activate windowed input behaviour
        flyCam.setDragToRotate(true);

        Box box = new Box(2, 2, 2);
        Geometry geom = new Geometry("Box", box);
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        geom.setMaterial(mat);

        rootNode.attachChild(geom); // make the cube appear in the scene
    }

    public JmeCanvasContext createJMEcanvas(){
        AppSettings settings = new AppSettings(true);
        settings.setWidth(640);
        settings.setHeight(480);

        this.setSettings(settings);
        this.createCanvas(); // create canvas!

        JmeCanvasContext ctx = (JmeCanvasContext) this.getContext();
        ctx.setSystemListener(this);
        Dimension dim = new Dimension(640, 480);
        ctx.getCanvas().setPreferredSize(dim);

        return ctx;
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                SwingCanvas canvasApplication = new SwingCanvas();

                JFrame window = new JFrame("Swing Application");
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                window.add(canvasApplication.createJMEcanvas().getCanvas());
                window.pack();
                window.setVisible(true);

                canvasApplication.start();              
            }
        });
    }
}
package jme3test.helloworld;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

import com.jme3.system.JmeCanvasContext;

public class SwingApplicationJME {

    public SwingApplicationJME(){
        JFrame frame = new JFrame("JME Swing Application");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(getLayout());
        frame.setVisible(true);
    }

    private JComponent getLayout(){
        JTabbedPane tabbedPane = new JTabbedPane();

        SwingCanvas canvas1 = new SwingCanvas();
        SwingCanvas canvas2 = new SwingCanvas();
        SwingCanvas canvas3 = new SwingCanvas();

        JmeCanvasContext ctx1 = canvas1.createJMEcanvas();
        JmeCanvasContext ctx2 = canvas2.createJMEcanvas();
        JmeCanvasContext ctx3 = canvas3.createJMEcanvas();

        JPanel JME_panel_1 = new JPanel(new BorderLayout());
        JME_panel_1.add(new JButton("WEST"), BorderLayout.WEST);
        JME_panel_1.add(new JButton("NORTH"), BorderLayout.NORTH);
        JME_panel_1.add(new JButton("EAST"), BorderLayout.EAST);
        JME_panel_1.add(new JButton("SOUTH"), BorderLayout.SOUTH);
        JME_panel_1.add(ctx1.getCanvas(), BorderLayout.CENTER);

        JPanel JME_panel_2 = new JPanel();
        JSplitPane splitPaneVertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        splitPaneVertical.add(new JButton("Vertical Button"), JSplitPane.LEFT);
        splitPaneVertical.add(ctx2.getCanvas(), JSplitPane.RIGHT);
        JME_panel_2.add(splitPaneVertical);

        JPanel JME_panel_3 = new JPanel();
        JSplitPane splitPaneHorizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPaneHorizontal.add(new JButton("Horizontal Button"), JSplitPane.TOP);
        splitPaneHorizontal.add(ctx3.getCanvas(), JSplitPane.BOTTOM);
        JME_panel_3.add(splitPaneHorizontal);

        tabbedPane.add(JME_panel_1, "JME border panel");
        tabbedPane.add(JME_panel_2, "JME vetical split panel");
        tabbedPane.add(JME_panel_3, "JME horizontal split panel");

        return tabbedPane;
    }

    public static void main(String [] s){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                SwingApplicationJME app = new SwingApplicationJME();
            }
        });
    }
}
SwingApplicationJME.java:

package jme3test.helloworld;

import java.awt.Dimension;
import javax.swing.JFrame;

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeCanvasContext;

public class SwingCanvas extends SimpleApplication {

    private void SwingCanvasTest() {
        SwingCanvas app = new SwingCanvas();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        // activate windowed input behaviour
        flyCam.setDragToRotate(true);

        Box box = new Box(2, 2, 2);
        Geometry geom = new Geometry("Box", box);
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        geom.setMaterial(mat);

        rootNode.attachChild(geom); // make the cube appear in the scene
    }

    public JmeCanvasContext createJMEcanvas(){
        AppSettings settings = new AppSettings(true);
        settings.setWidth(640);
        settings.setHeight(480);

        this.setSettings(settings);
        this.createCanvas(); // create canvas!

        JmeCanvasContext ctx = (JmeCanvasContext) this.getContext();
        ctx.setSystemListener(this);
        Dimension dim = new Dimension(640, 480);
        ctx.getCanvas().setPreferredSize(dim);

        return ctx;
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                SwingCanvas canvasApplication = new SwingCanvas();

                JFrame window = new JFrame("Swing Application");
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                window.add(canvasApplication.createJMEcanvas().getCanvas());
                window.pack();
                window.setVisible(true);

                canvasApplication.start();              
            }
        });
    }
}
package jme3test.helloworld;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

import com.jme3.system.JmeCanvasContext;

public class SwingApplicationJME {

    public SwingApplicationJME(){
        JFrame frame = new JFrame("JME Swing Application");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(getLayout());
        frame.setVisible(true);
    }

    private JComponent getLayout(){
        JTabbedPane tabbedPane = new JTabbedPane();

        SwingCanvas canvas1 = new SwingCanvas();
        SwingCanvas canvas2 = new SwingCanvas();
        SwingCanvas canvas3 = new SwingCanvas();

        JmeCanvasContext ctx1 = canvas1.createJMEcanvas();
        JmeCanvasContext ctx2 = canvas2.createJMEcanvas();
        JmeCanvasContext ctx3 = canvas3.createJMEcanvas();

        JPanel JME_panel_1 = new JPanel(new BorderLayout());
        JME_panel_1.add(new JButton("WEST"), BorderLayout.WEST);
        JME_panel_1.add(new JButton("NORTH"), BorderLayout.NORTH);
        JME_panel_1.add(new JButton("EAST"), BorderLayout.EAST);
        JME_panel_1.add(new JButton("SOUTH"), BorderLayout.SOUTH);
        JME_panel_1.add(ctx1.getCanvas(), BorderLayout.CENTER);

        JPanel JME_panel_2 = new JPanel();
        JSplitPane splitPaneVertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        splitPaneVertical.add(new JButton("Vertical Button"), JSplitPane.LEFT);
        splitPaneVertical.add(ctx2.getCanvas(), JSplitPane.RIGHT);
        JME_panel_2.add(splitPaneVertical);

        JPanel JME_panel_3 = new JPanel();
        JSplitPane splitPaneHorizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPaneHorizontal.add(new JButton("Horizontal Button"), JSplitPane.TOP);
        splitPaneHorizontal.add(ctx3.getCanvas(), JSplitPane.BOTTOM);
        JME_panel_3.add(splitPaneHorizontal);

        tabbedPane.add(JME_panel_1, "JME border panel");
        tabbedPane.add(JME_panel_2, "JME vetical split panel");
        tabbedPane.add(JME_panel_3, "JME horizontal split panel");

        return tabbedPane;
    }

    public static void main(String [] s){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                SwingApplicationJME app = new SwingApplicationJME();
            }
        });
    }
}

任何想法请=)

在jmonkeyengine文档中找到了一个方便的解决方案:

以下是代码引用:

final JMenuItem itemSwitchTab = new JMenuItem("Switch to tab #2");
    menuTortureMethods.add(itemSwitchTab);
    itemSwitchTab.addActionListener(new ActionListener(){
       public void actionPerformed(ActionEvent e){
           if (itemSwitchTab.getText().equals("Switch to tab #2")){
               canvasPanel1.remove(canvas);
               canvasPanel2.add(canvas, BorderLayout.CENTER);
               currentPanel = canvasPanel2;
               itemSwitchTab.setText("Switch to tab #1");
           }else if (itemSwitchTab.getText().equals("Switch to tab #1")){
               canvasPanel2.remove(canvas);
               canvasPanel1.add(canvas, BorderLayout.CENTER);
               currentPanel = canvasPanel1;
               itemSwitchTab.setText("Switch to tab #2");
           }
       } 
    });

我们只需要从一个选项卡中删除画布,然后添加到另一个选项卡。

也许每个画布都需要一个单独的线程?不过,这只是一个疯狂的想法。也许,只是认为它们已经在分离的线程中:private void swingcanvast(){SwingCanvas app=new SwingCanvas();app.start();}