# Durch Klick auf den JButton will ich die Farbe ändern?



## estartu (11. Mai 2007)

Hallo,
bin neu im jogl programmieren und hätte da mal eine Frage.

Ich habe hier ein kleines swing programm mit Border-Layout.
Nach Borderlayout.West habe ich einen JButton gelegt.

In BorderLayout.Center wird mit folgendem code mein Würfel in Rot gezeichnet.


  public void display(GLAutoDrawable arg0)
    {
        GL gl = arg0.getGL();
        GLU glu = new GLU();
        GLUT glut = new GLUT();
        glu.gluLookAt(0, 12, 19,0, 0, 0, 0, 1, 0);
        gl.glColor3f(1.0f,0.0f,0.0f);	//rot
	  gl.glScalef (1.0f, 1.0f, 1.0f);      // modeling transformation 
    	  glut.glutWireCube (3.0f);
    }

Wie kriege ich es hin das wenn ich den JButton anklicke sich die Farbe des Würfels von Rot nach Blau ändert.

Einen ActionListener für den JButton gibt es natürlich und der funktioniert auch.

estartu


----------



## merlin2 (11. Mai 2007)

Mit einem _boolean_ festlegen, ob rot oder blau gezeichnet werden soll. Diesen _boolean_ fragst du in _display()_ ab, setzt die Farbe entsprechend und beim Klick auf den Button änderst du den _boolean_ eben. Dann musst du nur noch dafür sorgen, dass _display()_ aufgerufen wird.


----------



## estartu (12. Mai 2007)

Hallo merlin2,
das werde ich so mal probieren.
Aber wie soll ich denn dafür sorgen das display aufgerufen wird?
„public void display(GLAutoDrawable arg0)”
Woher bekomme ich denn  GLAutoDrawable damit ich damit dann display aufrufen kann?

estartu


----------



## doctus (12. Mai 2007)

jogl.info hat gesagt.:
			
		

> Die Methode display(..) wird immer dann aufgerufen, wenn tatsächlich gerendert werden soll. Das kann z.B. durch einen Aufruf von repaint() geschehen



Lg doctus


----------



## estartu (14. Mai 2007)

Hallo,
das habe ich auch auf deren Webseite gelesen aber das funktioniert bei mir nicht.
Hier mal mein Quelltext.
Ich habe ein paar System.out.pr… eingefügt um zu sehen ob das Programm richtig ausgeführt wird und das wird es auch.

Die Zeile System.out.println(„Bin in display“); zeigt an wann display aufgerufen wird.
Das passiert bei meinem Programm nur wenn ich das Fenster klein und wieder gross mache oder es verschiebe.
Ich kriege es nicht hin das diplay aufgerufen wird wenn ich auf den Button klicke um die Farbe zu ändern.
Ich muss das Fenster dann erst verschieben damit sich die Farbe der Grafik ändert. 
Was mache ich denn falsch? Ich muss doch, wenn ich irgend einen Parameter geändert habe das Neuzeichnen der Grafik veranlassen können.

estartu


```
class joglFrame extends JFrame
{
	BeispielszeneView view;
	
    public joglFrame()
    {
        GLCapabilities glcaps = new GLCapabilities();
        GLCanvas canvas = new GLCanvas();
        view = new BeispielszeneView();
        canvas.addGLEventListener(view);
        setSize(2000,750);
        setTitle("Buttontest"); 
        setResizable(false);
        getContentPane().add(canvas,BorderLayout.CENTER);
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        
                
        JButton jb1 = new JButton("JButton");
        jb1.addActionListener(new jb1Action());
        getContentPane().add(jb1,BorderLayout.WEST);

    }

    class jb1Action implements ActionListener
	{
		public void actionPerformed(ActionEvent ae)
		{
			System.out.println("Der Button wurde geklickt. Die Farben werden gewechselt und repaint wird aufgerufen.");
			view.farbe_1 = 1.0f; 
			view.farbe_2 = 0.0f; 
			repaint();
			view.neumalen(); //Es wird nochmal repaint aufgerufen
		}
	} 
}    



class BeispielszeneView extends JFrame implements GLEventListener
{
    
    float farbe_1 = 0.0f;
    float farbe_2 = 1.0f;
    
    public void init(GLAutoDrawable arg0)
    {
    	GL gl = arg0.getGL();
        GLU glu = new GLU();
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        setCamera(gl, glu);
        gl.glMatrixMode(GL.GL_MODELVIEW); 
    }
    private void setCamera(GL gl, GLU glu)
    {
    	int w = 500, h = 500;
        gl.glViewport(0, 0, w, h);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(50.0, 1, 2.0, 40.0);
    }

    public void display(GLAutoDrawable arg0)
    {
    	System.out.println("Bin in display");
    	
    	GL gl = arg0.getGL();
        GLU glu = new GLU();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
    	
        gl.glColor3f(farbe_1,farbe_2,0.0f);
        
    	gl.glLoadIdentity();
        glu.gluLookAt(0, 12, 19,0, 0, 0, 0, 1, 0);
        gl.glTranslated(0, 1, 0); 
        drawField(gl, glu); 
    }
    
  
    public void neumalen()
    {
    	System.out.println("bin nun in neumalen und rufe nun auch repaint auf");
    	repaint();
    }
    
    public void drawField(GL gl, GLU glu)
    {
        	gl.glBegin(GL.GL_QUADS);
            gl.glVertex3f(-6.5f, -1.5f, -6.5f);
            gl.glVertex3f(-6.5f, -1.5f, 6.5f);
            gl.glVertex3f(6.5f, -1.5f, 6.5f);
            gl.glVertex3f(6.5f, -1.5f, -6.5f);
            gl.glEnd();
    }
    
    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,     int arg4)
    {
    }
    public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean     arg2)
    {
    }
}

public class ButtonTest
{
    public static void main(String[] args)
    {
        final joglFrame app = new joglFrame(); 
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                app.setVisible(true);
            }
        }); 
    }
}
```


----------



## merlin2 (16. Mai 2007)

Bitte mach mal was Ausführbares aus dem Code.

Ich glaube einfach, dass repaint nicht dafür sorgt, dass display aufgerufen wird.


----------



## merlin2 (17. Mai 2007)

Die Klasse Animator sorgt dafür, dass display so oft wie möglich aufgerufen wird.
Ist so zwar nicht ganz passend , aber vielleicht findest du ja den Quellcode?


----------



## estartu (21. Mai 2007)

Hallo.
Der code ist doch ausführbar. In der public class ButtonTest  gibt es eine main.
Einfach in ein eclipse Projekt einfügen und schon läuft das Programm. (main klasse im eclipse Projekt entsprechend anpassen).
Ich habe Mittlerweilen herausgefunden an was es lag.
Ein „canvas.display()" in actionPerformed() einfügen und schon wird display nach einem klick auf den JButton ausgeführt und somit die Änderungen angezeigt.

estartu


----------



## merlin2 (21. Mai 2007)

Abhaken!


----------

