package basic.javaGUI; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.UIManager; import org.mt4j.MTApplication; import org.mt4j.components.MTComponent; import org.mt4j.components.visibleComponents.shapes.MTEllipse; import org.mt4j.components.visibleComponents.shapes.MTRectangle; import org.mt4j.components.visibleComponents.shapes.MTRoundRectangle; import org.mt4j.components.visibleComponents.widgets.MTOverlayContainer; import org.mt4j.input.gestureAction.InertiaDragAction; import org.mt4j.input.inputProcessors.componentProcessors.dragProcessor.DragProcessor; import org.mt4j.util.MTColor; import org.mt4j.util.math.ToolsMath; import org.mt4j.util.math.Vector3D; public class StartSwingExample extends JFrame { public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } StartSwingExample swingFrame = new StartSwingExample(); } public StartSwingExample(){ this.setTitle("Swing Test"); //Should be called early before initializing opengl stuff this.setVisible(true); final Container content = this.getContentPane(); this.setLayout(new BorderLayout()); //Create our mt4j applet final MTApplication instance = new TestMTApplication(); instance.frame = this; //Important for registering the Windows 7 Touch input instance.init(); JPanel panel1 = new JPanel(new FlowLayout()); content.add(panel1, BorderLayout.WEST); JButton e2 = new JButton("Clear"); e2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (instance.getCurrentScene() != null){ instance.invokeLater(new Runnable() { public void run() { MTComponent[] ch = instance.getCurrentScene().getCanvas().getChildren(); for (int i = 0; i < ch.length; i++) { MTComponent mtComponent = ch[i]; if (!(mtComponent instanceof MTOverlayContainer)){ mtComponent.destroy(); } } } }); } } }); panel1.add(e2); // Add components to the content //Add MT4j applet JPanel pane = new JPanel(new GridLayout(0,1)); pane.add(instance); content.add(pane, BorderLayout.SOUTH); /////////MEnu //So that the menu will overlap the heavyweight opengl canvas JPopupMenu.setDefaultLightWeightPopupEnabled(false); //Create the menu bar. JMenuBar menuBar = new JMenuBar(); //Build the first menu. JMenu menu = new JMenu("Add"); menu.setMnemonic(KeyEvent.VK_A); menuBar.add(menu); JMenuItem addRectItem = new JMenuItem("MTRectangle", KeyEvent.VK_T); addRectItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (instance.getCurrentScene() != null){ //If we want to modify the MT4j applet from the swing thread //we should wrap the actions into an invokeLater runnable which //will be executed the next time the mt4j thread runs. instance.invokeLater(new Runnable() { public void run() { MTRectangle r = new MTRectangle(0,0,ToolsMath.getRandom(50, 250),ToolsMath.getRandom(50, 250), instance); r.setFillColor(new MTColor(ToolsMath.getRandom(50,255),ToolsMath.getRandom(50,255),ToolsMath.getRandom(50,255))); r.addGestureListener(DragProcessor.class, new InertiaDragAction()); instance.getCurrentScene().getCanvas().addChild(r); r.setPositionGlobal(new Vector3D(ToolsMath.getRandom(0, instance.width), ToolsMath.getRandom(0, instance.height))); } }); } } }); menu.add(addRectItem); JMenuItem addRoundRectItem = new JMenuItem("MTRoundRectangle", KeyEvent.VK_E); addRoundRectItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (instance.getCurrentScene() != null){ //If we want to modify the MT4j applet from the swing thread //we should wrap the actions into an invokeLater runnable which //will be executed the next time the mt4j thread runs. instance.invokeLater(new Runnable() { public void run() { float arc = ToolsMath.getRandom(8, 25); MTRoundRectangle r = new MTRoundRectangle(0,0,0, ToolsMath.getRandom(50, 250),ToolsMath.getRandom(50, 250), arc, arc, instance); r.setFillColor(new MTColor(ToolsMath.getRandom(50,255),ToolsMath.getRandom(50,255),ToolsMath.getRandom(50,255))); r.addGestureListener(DragProcessor.class, new InertiaDragAction()); instance.getCurrentScene().getCanvas().addChild(r); r.setPositionGlobal(new Vector3D(ToolsMath.getRandom(0, instance.width), ToolsMath.getRandom(0, instance.height))); } }); } } }); menu.add(addRoundRectItem); JMenuItem addEllItem = new JMenuItem("MTEllipse", KeyEvent.VK_E); addEllItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (instance.getCurrentScene() != null){ //If we want to modify the MT4j applet from the swing thread //we should wrap the actions into an invokeLater runnable which //will be executed the next time the mt4j thread runs. instance.invokeLater(new Runnable() { public void run() { MTEllipse e = new MTEllipse(instance, new Vector3D(0,0), ToolsMath.getRandom(50, 150),ToolsMath.getRandom(50, 150)); e.setFillColor(new MTColor(ToolsMath.getRandom(50,255),ToolsMath.getRandom(50,255),ToolsMath.getRandom(50,255))); e.addGestureListener(DragProcessor.class, new InertiaDragAction()); instance.getCurrentScene().getCanvas().addChild(e); e.setPositionGlobal(new Vector3D(ToolsMath.getRandom(0, instance.width), ToolsMath.getRandom(0, instance.height))); } }); } } }); menu.add(addEllItem); //Help Menu JMenu helpMenu = new JMenu("Help"); helpMenu.setMnemonic(KeyEvent.VK_H); JMenuItem aboutItem = new JMenuItem("About", KeyEvent.VK_A); aboutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { JDialog f = new SimpleAboutDialog(StartSwingExample.this); f.setVisible(true); } }); helpMenu.add(aboutItem); menuBar.add(helpMenu); this.setJMenuBar(menuBar); ////////Menu this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); // does layout of components. } private class TestMTApplication extends MTApplication{ @Override public void startUp() { //This causeD the craetion of a new rendrer (-> new opengl context) //so opengl objects like displaylists etc would get deleted! // setPreferredSize(new Dimension(MT4jSettings.getInstance().getScreenWidth(),MT4jSettings.getInstance().getScreenHeight())); // pack(); // setResizable(false); this.addScene(new TestScene(this, "test scene")); } } public class SimpleAboutDialog extends JDialog { public SimpleAboutDialog(JFrame parent) { super(parent, "About", true); Box b = Box.createVerticalBox(); b.add(Box.createGlue()); b.add(new JLabel(" MT4j example application")); b.add(new JLabel(" This shows how to integrate MT4j into")); b.add(new JLabel(" a java swing/awt application")); b.add(new JLabel(" Visit www.mt4j.org")); b.add(Box.createGlue()); getContentPane().add(b, BorderLayout.CENTER); JPanel p2 = new JPanel(); JButton ok = new JButton("Ok"); p2.add(ok); getContentPane().add(p2, BorderLayout.SOUTH); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { setVisible(false); } }); setSize(250, 150); } } }