gpt4 book ai didi

java - JME 3 + Swing,多 Canvas

转载 作者:搜寻专家 更新时间:2023-11-01 02:51:39 25 4
gpt4 key购买 nike

我正在玩 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com