# SimpleUniverse in JPanel



## resTive (15. Mai 2007)

Hi ihr,

ich spiele grade ein wenig mit dem SimpleUniverse (Canvas3D) rum und habe versucht das SimpleUniverse in ein JPanel zu stecken, welches in JSplitPanes positioniert ist. 
Allerdings wird es mir nicht angezeigt. Es erscheint auch keine Fehlermeldung. Lass ich das Canvas3D direkt auf den ContentPane zeichnen, funktioniert das wunderbar. Kann mir jemand erklären was ich falsch mache, bzw ob das vielleicht so garnicht geht, wie ich das vorhabe?

Hier mal der Code dazu:


```
public class Client extends JFrame {
	
	private static Client sInstance;
	private static boolean sIsInitialized;
	
	private JPanel iInformationPanel;
	private JPanel iGraphicPanel;
	private JPanel iStatusPanel;
	
	public static void initialize() {
		if (sInstance == null) {
			sInstance = new Client();
		}
		sIsInitialized = true;
	}
	
	public static boolean isInitialized() {
		return sIsInitialized;
	}
	
	public static Client getInstance() {
		return sInstance;
	}

	private Client() {
		this.setTitle("J3D Experimente");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(new Dimension(1024, 768));
		
		iInformationPanel = new JPanel(new GridBagLayout());
		iInformationPanel.setPreferredSize(new Dimension((int)(this.getWidth()*0.25), (int)(this.getHeight()*0.75)));
		
		iGraphicPanel = new JPanel();
		iGraphicPanel.setPreferredSize(new Dimension((int)(this.getWidth()*0.25), (int)(this.getHeight()*0.75)));
		iStatusPanel = new JPanel(new GridBagLayout());
		
		iInformationPanel.add(new JLabel("Information"));
		iStatusPanel.add(new JLabel("Status"));
		
		
		Canvas3D c3d = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); //So am besten
		SimpleUniverse simpleU = new SimpleUniverse(c3d); //Das VirtualUniverse, hier wird auch schon der View hinzugefügt
		BranchGroup bg = new BranchGroup(); //Haupt-BranchGroup
		bg.addChild(new ColorCube(0.4f/*Größe*/)); //ColorCube wird hinzugefügt

		OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL); //OrbitBehavior liegt in dem Paket com.sun.j3d.utils.behaviors.vp
		orbit.setSchedulingBounds(new BoundingSphere());
		simpleU.getViewingPlatform().setViewPlatformBehavior(orbit);

		bg.compile(); //Optimiert das Rendern
		
		simpleU.addBranchGraph(bg); //Fügt den SceneGraph hinzu
		simpleU.getViewingPlatform().setNominalViewingTransform(); //Versetzt die Kamera so, dass man gleich etwas sehen kann
		//So einfach war das :)
		iGraphicPanel.add(c3d); //Vor 1.5: getContentPane().add
		
		JSplitPane lTopSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, iInformationPanel, iGraphicPanel);
		lTopSplitPane.setDividerSize(3);
		JSplitPane lBottomSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, lTopSplitPane, iStatusPanel);
		lBottomSplitPane.setDividerSize(3);

		
		Container lContainer = this.getContentPane();
		lContainer.setLayout(new BorderLayout());
		lContainer.add(lBottomSplitPane, BorderLayout.CENTER);
			
		//this.addComponentListener(new ClientComponentListener());
		this.setLocationRelativeTo(null);
	}
	
	public static void main(String args[]) {
		Client.initialize();
		Client.getInstance().setVisible(true);
	}
}
```

gruß
resTive


----------



## resTive (15. Mai 2007)

hm. So wie es aussieht, hat es etwas mit dem heavy (hier canvas3d) und lightweight (swing-Komponenten) Problem zu tun. 

Vielleicht hat jemand sowas schonmal gemacht und hat nen Tipp für mich?

gruß
resTive


----------



## resTive (15. Mai 2007)

so nach langem lesen und tüfteln funktioniert es nun, in dem ich mir eine eigene von JPanel ableitende klasse gebaut habe.


```
public class GraphicPanel extends JPanel {
	SimpleUniverse universe;

	public GraphicPanel() {
		setLayout(new BorderLayout());
		JPopupMenu.setDefaultLightWeightPopupEnabled(false);
		Canvas3D c3d = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); 
		SimpleUniverse simpleU = new SimpleUniverse(c3d);
		
		BranchGroup bg = new BranchGroup();
		bg.addChild(new ColorCube(0.2f));
		bg.compile();

		OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL);
		orbit.setSchedulingBounds(new BoundingSphere());
		simpleU.getViewingPlatform().setViewPlatformBehavior(orbit);
		simpleU.getViewingPlatform().setNominalViewingTransform();
		bg.compile();

		simpleU.addBranchGraph(bg);
		this.add(c3d);
	}
}
```

Prinzipiell kann das abgehakt werden, allerdings verstehe ich den Unterschied nicht. Oder habe ich lediglich ein gewaltiges Brett vorm kopf?

gruß
resTive


----------



## taejon (11. Jun 2007)

Hi 

ich habe ein aehnliches Problem (siehe späterer Eintrag "Box nicht sichtbar")

ich habe versucht im Rahmen von awt das zu lösen und mich stark an deinem Konzept der extrapanelklasse gehalten, dummerweise geht das immer noch nicht. Weisst du rat ? Ich vermute dass das Problem ähnlich gelagert ist.
Ich schicke mal meinen neuen Code... vielleicht schaut mal jemand drauf was da faul sein könnte...
Fehler werden nicht geworfen.
Entwicklungsumgebung: Eclipse 3.2 auf PC Win XP
merci im voraus




```
import java.awt.Frame;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.Rectangle;
import java.awt.Scrollbar;
import java.awt.TextField;
import java.awt.Window;
import javax.swing.*;
import java.awt.Panel;
import java.awt.GridBagLayout;
import javax.swing.JSlider;
import java.awt.Button;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;  // Muss man komischerweise extra importieren (schwachsinn hoch 3 grrr!!)
// Jetzt die java3D Libs
import javax.media.j3d.*;
import com.sun.j3d.utils.behaviors.vp.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.ColorCube;


public class efgtry1 extends Frame {

	private static final long serialVersionUID = 1L;
	private Label label = null;
	private Label label1 = null;
	private Label label2 = null;	
	private Panel panel = null;
//	protected SimpleUniverse myUniverse;
	protected BranchGroup rootBranchGroup;
	
	private Panel getPanel() {
	/*	if (panel == null) {
			panel = new Panel();
			panel.setLayout(new GridBagLayout());
			panel.setBounds(new Rectangle(159, 76, 430, 314));
		}
*/
		return panel;
	}
	
	public efgtry1()    // Standardkonstruktor 
	{
		super(" Berechnung des EFG");
		initialize();
		setSize(800, 700);
		setVisible(true);
	}
	private void initialize() {
		
		label2 = new Label();
		label2.setBounds(new Rectangle(7, 126, 45, 23));
		label2.setText("a0");
		
		label1 = new Label();
		label1.setBounds(new Rectangle(7, 99, 45, 23));
		label1.setText("Sclice");
		
		label = new Label();
		label.setBounds(new Rectangle(7, 72, 45, 23));
		label.setText("Gridsize");
		
		this.setLayout(null);
		this.setSize(604, 402);
		this.setTitle("Frame");
		this.add(label, null);
		this.add(label1, null);
		this.add(label2, null);		
	//	this.add(getPanel());	
	}	
	public static void main(String[] args) 
	{
		efgtry1 efgwin = new efgtry1();
		GraphicPanel gpanel = new GraphicPanel();
		efgwin.show();
	}
}  //  @jve:decl-index=0:visual-constraint="10,10"


public class GraphicPanel extends Panel
{
	SimpleUniverse myUniverse;	
	public GraphicPanel()
	{
	  setLayout(new BorderLayout());
	  Canvas3D myCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());	  		
	  SimpleUniverse myUniverse = new SimpleUniverse(myCanvas3D);	  
	  BranchGroup bg = new BranchGroup();
	  bg.addChild(new ColorCube(0.2f));
	  bg.compile();
	  
	  OrbitBehavior orbit = new OrbitBehavior(myCanvas3D, OrbitBehavior.REVERSE_ALL); 
      orbit.setSchedulingBounds(new BoundingSphere()); 
      myUniverse.getViewingPlatform().setViewPlatformBehavior(orbit); 
      myUniverse.getViewingPlatform().setNominalViewingTransform(); 
      bg.compile(); 

      myUniverse.addBranchGraph(bg); 
      this.add(myCanvas3D); 

	}
}
```


----------



## taejon (12. Jun 2007)

Hi

ich fand ein (für mich) sehr hilfreiches Beispiel unter folgendem Link: 
Mir hat es geholfen...

http://www.java-tips.org/other-api-tips/java3d/how-to-create-a-spline-animation-in-java3d.html

Es werden 2 Panels benutzt... hmm an der Stelle hat Java3d sicher noch Optimierungsbedarf


----------

