java - JME 3 + Swing,多 Canvas

标签 java swing jmonkeyengine

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

当 LWJGL Canvas 包含在应用程序的多个选项卡中时,没有一个或只运行 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();              
            }
        });
    }
}

SwingApplicationJME.java:

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文档上找到了一个方便的解决方案:Monkey canvas + Swing GUI

代码引用如下:

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");
           }
       } 
    });

我们只需要从一个选项卡中删除 Canvas 并添加到另一个选项卡即可。

关于java - JME 3 + Swing,多 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10129576/

相关文章:

java - 渲染 3D 第三人称 View

java - 为什么宇宙飞船没有出现?

java - 通用接口(interface)有好处吗?

java - 将前几个元素分组在一起

java - 单击任意位置后,将 fillAfter 设置为 true 的 Android 动画会重置

java - 调用 SwingWorker.get( ) 时防止 GUI 卡住

java - 有人可以帮我处理返回函数吗?

java - 自定义单元格渲染器可以定义对象(如表单)的属性吗?

java - 自定义 JComboBox 顶部标签

java - 对于多人游戏场景,如何在客户端之间序列化更新消息?