# JOGL Button-klick-Problem



## Polli (5. Jan 2010)

Hallo alle zusammen,

ich habe ein kleines Problem, seit knapp zwei Tagen versuche ich mich an Jogl, bislangen mit mittelmäßigen Erfolg.
Ich habe an zwei Stellen ein Problem, evtl. könnt ihr mir ja dabei helfen, da ich gesehen habe, dass ihr schon ein Problem bezüglich Jogl gelöst habt.

Und zwar ist mein erstes Problem: Wenn ich auf den Button "Linien" klicke, soll eigentlich eine Linie vom Mittelpunkt zur rechten oberen Ecke führen, aber irgendwie klappt das nicht. Ich komme einfach nicht weiter, habt ihr eine Idee was ich da machen kann? Ich habe es schon mit repaint probiert, aber es lieferte nicht den gewünschten Erfolg.

Mein Zweites Problem ist, wenn ich das Fenster größer ziehe dann wird das Panel blau, also so dass alles was drauf ist nicht mehr sichtbar ist. Beim zweiten mal ziehen ist alles wieder da... Könnt ihr mir evtl. eine Lösung oder einen Tipp geben?

Danke für eure Hilfe 

Hier mal mein Quellcode:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import net.java.games.jogl.*;
import net.java.games.jogl.util.*;

public class Darstellung implements GLEventListener {
	int size_x = 800;
	int size_y = 600;
	JFrame frame;
	JMenuBar menuebar;
	JPanel toolbarPanel;
	GLCanvas panel1;
	GLCanvas panel2;
	JTabbedPane tabbedpane;
	JMenu fileMenue;
	JMenu helpMenue;
	JMenuItem neuItem;
	JMenuItem openItem;
	JMenuItem saveItem;
	JMenuItem helpItem;
	JMenuItem copyrightItem;
	GridBagLayout layout;
	JButton kreisButton;
	JButton eckButton;
	JButton linienButton;
	JButton punktButton;
	JButton ellipseButton;
	JButton kugelButton;
	JButton polygoneButton;
	JButton ellipsoidButton;
	GL gl;
	GLU glu;
	GLUT glut;

	public Darstellung() {
		Window();
	}

	public void Window() {
		frame = new JFrame("Architekten-Tool");
		frame.setSize(size_x, size_y);
		javax.swing.JPopupMenu.setDefaultLightWeightPopupEnabled(false); //MenuBar in den Vordergrund
		frame.setJMenuBar(MenueHilfe());
		compLayout();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	public JMenuBar MenueHilfe() {
		menuebar = new JMenuBar();
		fileMenue = new JMenu("Datei");
		menuebar.add(fileMenue);
		fileMenue.add(neuItem = new JMenuItem("Neu"));
		fileMenue.add(openItem = new JMenuItem("Öffnen"));
		fileMenue.add(saveItem = new JMenuItem("Speichern"));
		helpMenue = new JMenu("Hilfe");
		menuebar.add(helpMenue);
		helpMenue.add(helpItem = new JMenuItem("Hilfe"));
		helpMenue.add(copyrightItem = new JMenuItem("Copyright"));

		return menuebar;
	}

	public JTabbedPane Tabbed() {
		panel1 = GLDrawableFactory.getFactory().createGLCanvas(
				new GLCapabilities());
		panel2 = GLDrawableFactory.getFactory().createGLCanvas(
				new GLCapabilities());
		
		panel1.addGLEventListener(this);
		tabbedpane = new JTabbedPane();
		tabbedpane.addTab("New 1", panel1);
		tabbedpane.addTab("New 2", panel2);
		return tabbedpane;
	}

	public JPanel Toolbar() {
		JPanel toolbarPanel = new JPanel();
		kreisButton = new JButton("Kreis");
		eckButton = new JButton("n-Eck");
		linienButton = new JButton("Linien");
		linienButton.addActionListener(new LinienKlick());
		punktButton = new JButton("Punkt");
		ellipseButton = new JButton("Ellipse");

		kugelButton = new JButton("Kugel");
		polygoneButton = new JButton("Polygone");
		ellipsoidButton = new JButton("Ellipsoid");

		toolbarPanel.setLayout(new GridLayout(8, 1));

		// 2D
		toolbarPanel.add(kreisButton);
		toolbarPanel.add(eckButton);
		toolbarPanel.add(linienButton);
		toolbarPanel.add(punktButton);
		toolbarPanel.add(ellipseButton);

		// 3D
		toolbarPanel.add(kugelButton);
		toolbarPanel.add(polygoneButton);
		toolbarPanel.add(ellipsoidButton);
		return toolbarPanel;
	}

	public void compLayout() {
		Container c = frame.getContentPane();

		layout = new GridBagLayout();
		c.setLayout(layout);

		// x y w h wx wy
		addComponent2(c, layout, Tabbed(), 0, 0, 10, 10, 0.1, 0.1);
		addComponent1(c, layout, Toolbar(), 10, 0, 2, 10, 0, 0);
	}

	static void addComponent1(Container cont, GridBagLayout gbl, Component c,
			int x, int y, int width, int height, double weightx, double weighty) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.VERTICAL;
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbl.setConstraints(c, gbc);
		cont.add(c);
	}

	static void addComponent2(Container cont, GridBagLayout gbl, Component c,
			int x, int y, int width, int height, double weightx, double weighty) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbl.setConstraints(c, gbc);
		cont.add(c);
	}

	@Override
	public void init(GLDrawable arg0) {
		// TODO Auto-generated method stub
		gl = arg0.getGL();
		glu = arg0.getGLU();
		glut = new GLUT();
		gl.glClearColor(1, 1, 1, 0); 
		
		System.out.println("init");
	}
	
	@Override
	public void display(GLDrawable arg0) {
		// TODO Auto-generated method stub
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
		
		gl.glColor3d(1, 0, 0);
		gl.glBegin(GL.GL_LINES);
			gl.glVertex3d(0, 0, 0);
			gl.glVertex3d(50, 0, 0);
		gl.glEnd();
		
		System.out.println("display");
	}

	@Override
	public void displayChanged(GLDrawable arg0, boolean arg1, boolean arg2) {
		// TODO Auto-generated method stub
	}

	@Override
	public void reshape(GLDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
		// TODO Auto-generated method stub
	}
	
	public class LinienKlick implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent arg0) {
			System.out.println("g "+ gl);
			System.out.println("Ich werde aufgerufen...");
			gl.glColor3d(1, 0, 0);
			gl.glBegin(GL.GL_LINES);
				gl.glVertex3d(0, 0, 0);
				gl.glVertex3d(50, 50, 0);
			gl.glEnd();
			panel1.display();
		}	
	}
	
	public static void main(String[] args) {
		Darstellung gui = new Darstellung();
	}
}
```


Ganz liebe Grüße,

Polli.


----------



## Marco13 (5. Jan 2010)

Genau wie man bei Swing nur in der paintComponent in das übergebene Graphics zeichnen darf, darf man bei JOGL nur in der display-Methode mit dem dort vom Drawable abzuholenden GL zeichnen. 

Das Muster wäre demnach GANZ grob

```
private boolean zeichneLinie = false;

void display(...)
{
    if (zeichneLinie)
    { 
        // Zeichne sie
    }
}


void buttonKlick()
{
    zeichneLinie = true;
    repaint();
}
```


----------



## Guest2 (5. Jan 2010)

Moin,

das entscheidende hat Marco ja schon gesagt.

Was mir allerdings noch aufgefallen ist:

1. Die von Dir verwendete JoGL Version ist ganz alt. Du solltest zumindest JoGL 1.1.1a nehmen. Das ist die letzte und aktuelle Version von JoGL1. Die gibt es hier: Index of /media/jogl/builds/archive/jsr-231-1.1.1a/

2. Wenn Du Swing und JoGL nutzt, solltest Du vermutlich lieber auf das GLCanvas verzichten und stattdessen zum GLJPanel greifen.

3. Da Du vermutlich mehr als eine Line zeichnen möchtest, musst Du Dir eine Datenstruktur ausdenken aus der heraus Du alle notwendigen Linien zeichnen kannst (wie bereits von Marco geschrieben: Dies darf nur innerhalb der display() geschehen). Neue Linien können dann z.B. innerhalb der actionPerformed() der Datenstruktur hinzugefügt werden.

4. Auch die display() sollte nie von Hand aufgerufen werden, sondern immer über einen (wie auch immer gearteten) Animator. (Bevor Du auf die Idee kommen solltest  )

Als kskb könnte das dann in etwa so aussehen (JoGL 1.1.1a):


```
package late.bluba;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.FloatBuffer;
import java.util.Random;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLJPanel;
import javax.media.opengl.glu.GLU;
import javax.swing.JButton;
import javax.swing.JFrame;

import com.sun.opengl.util.Animator;
import com.sun.opengl.util.BufferUtil;

@SuppressWarnings("serial")
public class MyPanel extends GLJPanel implements GLEventListener {

    private static final int  MAXLINES = 1000;

    private final FloatBuffer va;

    private int               lines    = 0;

    private GL                gl;
    private GLU               glu;


    public MyPanel() {

        super();

        va = BufferUtil.newFloatBuffer(MAXLINES * 2 * 3);

        addGLEventListener(this);

    }


    @Override
    public void init(final GLAutoDrawable drawable) {

        gl = drawable.getGL();
        glu = new GLU();

        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glEnableClientState(GL.GL_VERTEX_ARRAY);

    }


    @Override
    public void display(final GLAutoDrawable drawable) {

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();
        gl.glTranslatef(0, 0, -5);

        synchronized (va) {

            va.rewind();
            gl.glVertexPointer(3, GL.GL_FLOAT, 0, va);
            gl.glDrawArrays(GL.GL_LINES, 0, lines * 2);

        }

    }


    @Override
    public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, int height) {

        if (height <= 0)
            height = 1;

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 1000.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

    }


    public static void main(final String[] args) {

        final JFrame frame = new JFrame();
        final JButton button = new JButton();
        final Random random = new Random();
        final MyPanel canvas = new MyPanel();
        final Animator animator = new Animator(canvas);

        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {

                synchronized (canvas.va) {

                    for (int i = 0; i < 6; i++)
                        canvas.va.put(canvas.lines * 6 + i, random.nextFloat() - 0.5f);

                    canvas.lines++;
                }

            }
        });
        
        button.setText("new line");

        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(final WindowEvent e) {

                new Thread(new Runnable() {
                    public void run() {

                        animator.stop();
                        System.exit(0);

                    }
                }).start();
            }
        });

        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(canvas, BorderLayout.CENTER);
        frame.getContentPane().add(button, BorderLayout.SOUTH);

        frame.setSize(900, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        animator.start();

    }


    @Override public void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) { }

}
```

Gruß,
Fancy


----------

