# JFrame über mehrere JPanel und Listener



## elischa (25. Mai 2014)

Hallo Leute,
ich versuche die ganze Zeit zwei Minimalbeispiele einer GUI hinzukriegen, aber leider läuft im 2. Beispiel die ganze Zeit was schief. Beim ersten Bsp. habe ich versucht möglichst modular aufzubauen, und beim zweiten Bsp möglichst alles in eine Datei zu packen:

Bsp 1:
---------
Datei 1: C01JFrame.java


```
import java.awt.Color;
import javax.swing.JFrame;


public class C01JFrame extends JFrame {
       
    private static final long serialVersionUID = 1L;
    
    private C01JPanel myJPanel01;
    
    public C01JFrame() {
        
        super("FrameFenster");
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setSize(800,600);
        this.setBackground(Color.red);
        
        
        myJPanel01 = new C01JPanel();
        
        myJPanel01.setSize(300,200);
        myJPanel01.setBackground(Color.green);
        myJPanel01.setVisible(true);
        
        
        this.addKeyListener(myJPanel01);
        this.add(myJPanel01);
        
    }
}
```

Datei 2: C01JPanel.java


```
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;

public class C01JPanel extends JPanel implements KeyListener {
    
    private static final long serialVersionUID = 1L;
    private String a = "bla blub";
    
    public C01JPanel() {
        this.addKeyListener(this);
    }
    
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
            System.out.println("Hello");
            
            repaint();         
        }
    }
    
    public void keyTyped(KeyEvent ke) { }
    
    public void keyReleased(KeyEvent ke) { }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(10,10,10,10);
        g.drawString(a, 200, 300);
    }

}
```

Datei 3: C01Tester.java


```
public class C01Tester {

    public static void main(String[] args) {
        
        new C01JFrame();

    }

}
```

Warum resized oder packed das zweite grüne Panel vollständig über das Rote. Ich dachte eher daran, dass das rote Panel doch noch sichtbar sein würde. Und warum funzt es nicht wenn ich überall auf das JFrame mit getContentPane() zugreife anstatt mit this ?

Beispiel 2:
---------------
Datei C02JFrame.java


```
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class C02JFrame extends JFrame {
    
    private static final long serialVersionUID = 1L;
    String a= "bla blub";
    Container con;
    // custom jpanels declarations & instances used in outer JFrame 
    CinnerJPanel myJPanel01;
    // constructor of outer JFrame class
    public C02JFrame() {
        
        setSize(700,450);
        setBackground(Color.red);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        myJPanel01 = new CinnerJPanel();
        
        addKeyListener(myJPanel01);
        add(myJPanel01);
        
        con = this.getContentPane();
    }
    
    // definition of custom JPanel inner class
    class CinnerJPanel extends JPanel implements KeyListener {
        
        // var & declarations inner class
        private static final long serialVersionUID = 1L;
        
        // constructor inner class
        CinnerJPanel() {
            this.setSize(200,200);
            this.setBackground(Color.green);
            this.setVisible(true);
            con.addKeyListener(this);
            //con.addKeyListener(this);
        }
    
        // Listener inner class override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
                System.out.println("hoi !");
                repaint();
            }
        }
        public void keyReleased(KeyEvent arg0) { }

        public void keyTyped(KeyEvent arg0) { }
        
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillRect(400, 500, 60, 100);
            g.drawString("huhu !", 50, 80);
        }
        
    } // end of inner class
    
            
    // methods & flow of outer JFrame class
    // ...
    
    
    // runner
    public static void main (String[] args) {
        new Mini_JFrame();
    }

}
```

Krieg' im unteren Teil, gar keine Panels mehr hin. Jemand ne Idee was ich da machen könnte ?
Und noch was zu den Listener, s'is doch so, dass
ereignissAuslöser.addListener(empfänger) den Listener beim Auslöser registriert und nach oben weiterreicht oder ?
müsste ich dann bei einem Textfeld,
textfeld.addListener(myJPanel) und dann myJPanel.addListener(myJFrame) und dann myJFrame.addListener(myJFrame) implementieren ? Hab hier vorwärts, rückwärts und seitwärts alles durch, raff's irgendwie nicht, würde mich freuen, wenn jemand ein paar Tips hätte 

Viele Grüß Elischa


----------



## elischa (25. Mai 2014)

noch ne kurze Anmerkung
also ich meine nur ein Panel und ein JFrame, mehrere Panels wollt ich später mal nebeneinader probieren, auch wenn's jetzt nicht soo viel sinn macht und man ja eigentlich nur ein Panel immer austauscht, dass auf dem Frame liegt


----------



## elischa (31. Mai 2014)

im zweiten Beispiel sind mir paar Fehler unterlaufen:
...

```
Container con = new Container();
...
...
public static void main (String[] args) {
new C02JFrame();
...
```

Jedes mal krieg' ich mit den Layern  was anderes, hmm, wenn ich ein noch einfacheres Beispiel nehme:
Datei: FrameMitWindowListener.java


```
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;

public class FrameMitWindowListener extends JFrame implements WindowListener {
    
    private static final long serialVersionUID = 1L;
    private String myString = "bla";
    
    public FrameMitWindowListener() {
        super ("Fenster");
        this.setSize(800,600);
        this.setBackground(java.awt.Color.blue);
        this.setVisible(true);
        this.addWindowListener(this);
    }
    
    public void windowClosing(WindowEvent we) {
        System.out.println(myString+System.currentTimeMillis());
        System.exit(0);
    }

    public void windowActivated(WindowEvent arg0) { }

    public void windowClosed(WindowEvent arg0) { }

    public void windowDeactivated(WindowEvent arg0) { }

    public void windowDeiconified(WindowEvent arg0) { }

    public void windowIconified(WindowEvent arg0) { }

    public void windowOpened(WindowEvent arg0) { }
    
    public static void main (String[] args) {
        new FrameMitWindowListener();
        
    }

}
```

krieg ich kein blau rein, warum ?


----------



## Newcomer2 (2. Jun 2014)

Hallo elischa,

in deinem Konstruktor kannst du erstmal das 
	
	
	
	





```
this.
```
 vor den Eigenschaften weglassen.

Was die Listener angeht:
Du willst nen Panel mit Listener? Dann z.B.:

```
JPanel panel = new JPanel();
panel.addListener(this);  //z.B. MouseListener
/* musst dann den MouseListener implementieren lassen 
* dadurch wirste angewiesen, weitere Methoden hinzuzufügen 
*/
```

Nen Panel kannste aber nicht alleine lassen, entweder muss nen JFrame oder nen JWindow da sein, auf dem du das Panel legen willst:

Beispiel: JFrame mit JPanel in rot.


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

class xyz extends JFrame implements MouseListener{

public static void main(String args[])
{
xyz frame = new xyz();
frame.setBackground(Color.blue);
}

public xyz() {
super("Fenster");
setVisible(true);
setSize(800,600);
setLayout(null); // damit du Hintergund und Panel siehst, brauchste nen Layout
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setSize(200,200);
panel.setVisible(true);
panel.setLocation(50,50);
panel.addMouseListener(this);
panel.setBackground(Color.red);
add(panel, BorderLayout.WEST);
}


public void mouseClicked(MouseEvent arg0) {}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {};
//...

}
```

is nurn  beispiel


----------



## elischa (8. Jun 2014)

thx für die Tips, hab mal mit dem MouseListener und nochma ohne Layout auf die schnelle probiert, denk' ich nehm' mal dann doch nen Layout, sonst komm ich da nich gscheit auf'm Panel oder JFrame. Bin noch nicht ganz durchgestiegen, nur kurz dran schrauben können...die Tage mal nochmal üben... poste dann nochma wenn ich alles iwie in nen Beispiel drinne hab

```
//package testProject01;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FensterRunner extends JFrame implements MouseListener {
    
    JPanel myJPanel;
    
    public FensterRunner() {
        
        super("Frame");
        setSize(800,600); //@jframe
        setVisible(true); //@jframe
        
        myJPanel = new JPanel();
        myJPanel.setSize(400,300);
        myJPanel.setBackground(Color.DARK_GRAY);
        
        //@jframe
        //auslöser              empfänger
       // myJPanel.addMouseListener(this); //@jframe
        
//jframe                jframe
        addMouseListener(this); //@jframe
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //@jframe
        
        add(myJPanel); //@jframe
            
    }
    
    public void mouseClicked(MouseEvent me) {
       System.out.println(me.getX());
    }
    public void mouseEntered(MouseEvent arg0) {}
    public void mouseExited(MouseEvent arg0) {}
    public void mousePressed(MouseEvent arg0) {}
    public void mouseReleased(MouseEvent arg0) {    
    }
    
    public static void main (String[] args) {
        new FensterRunner();
    }
}
```


----------



## Newcomer2 (10. Jun 2014)

Mal so noch kurz nen Hinweis:

Das sogenannte "Null"-Layout (was ich verwendet hab im Beispiel) is eig. totaler Mist  
Verglichen mit den anderen Layout-Typen brauchste eine unmenge an Quellcode-Zeilen, da du für jedes Objekt die Größe und Position festlegen musst. Weiterhin haste hier keine automatische Größenaktualisierung, wenn du den Frame vergrößerst oder verkleinerst. Hier sind dann die anderen Layouts deutlich vorn.

Wenn Du aber nur 1 Panel in einem Frame haben willst und das kleiner als der Frame sein soll (eben kleines Panel irgendwo im Frame), dann kann man u.U. das "Null"-Layout nehmen. 

*Layout-Typen:*
"Null"-Layout

```
setLayout(null);
Objekt.setSize(b,h);
Objekt.setLocation(x,y);
//oder um beides zu kombinieren: Objekt.setBounds(x,y,b,h);
add(Objekt);
```

FlowLayout: 
Ordnet alle Objekte nebeneinander (im Frame oder Panel) an. Bei nur einem Objekt wird das Komplette Panel oder Frame ausgefüllt, ohne Rand. Bei mehreren Objekten haste zwischen den Objekten und drumherum gleichgroße Lücken.

```
setLayout(new FlowLayout());
add(Objekt);
```

BorderLayout:
Unterteilung des Frames/Panels in 5 Bereiche (Nord, Süd, Ost, West, Zentrum).
Hier kannste mit Hilfe der Himmelsrichtungen auch nur 1 Objekt einsetzen, und siehst das dahinterligende Trotzdem. 

```
setLayout(new BorderLayout());
add(Objekt,BorderLayout.SOUTH);
```

GridLayout:
Kannst im Layout direkt angeben, wie viele Objekte in Reihe und Spalte angeordnet sein sollen, außerdem gibt es noch die Möglichkeit anzugeben, ob und wie groß die Lücken zwischen den einzelnen Objekten sein sollen. Selbst bei einem Objekt kannste mehrere angeben, der verfügbare Platz wird entsprechend so eingeteilt, dass genügend Objekte den gleichen Bereich einnehmen können, wie Du angegeben hast.

```
setLayout(new GridLayout(s,z)); //ohne Lücken
setLayout(new GridLayout(s,z,h,b)); //mit Lücken zwischen den Objekten
add(Objekt);
```

GridBagLayout:
ähnlich wie GridLayout. Hier kannste das Frame/Panel in Bereiche einordnen und dann für deine Objekte festlegen, wie viele Bereiche es erhalten kann. Außerdem ist noch Möglichkeit geboten, für jedes Objekt einen Rand selbst definierter Größe einzubauen, ...


Hoffe, das hilft dir ein wenig bei der Wahl des richtigen Layouts


----------



## Newcomer2 (10. Jun 2014)

```
/*
 * Mal ein Beispiel, wie die einzelnen Layout-Manager arbeiten und wie die Anordnung der Objekte 
 * im einzelnen Manager aussehen könnte. Als Beispiel sind hier nur funktionslose Buttons im zweiten
 * Frame "Layout-Ansicht" verwendet worden.
 */ 

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Layouts extends JFrame implements ActionListener{

	static JFrame frame2; 
	static String[] str = {
			"null",
			"FlowLayout()",
			"BorderLayout()",
			"GridLayout(3,2)",
			"GridLayout(3,2,10,10)"};
	
	List<JButton> buttons = new ArrayList<JButton>();
	static List<JButton> buttons2 = new ArrayList<JButton>();
	
	public static void main(String[] args) {
		new Layouts(); 
		frame2 = new JFrame("Layout-Ansicht");
		frame2.setVisible(true);
		frame2.setLocationRelativeTo(null);
		frame2.setLayout(new FlowLayout());
		for(int i=0;i<5;i++) {
			JButton button =new JButton("Button0"+ (i+1));
			frame2.add(button); 
			buttons2.add(button); }
		frame2.pack();
		frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

	
	public Layouts() {
		super("Layout-Typen");
		setLayout(new FlowLayout());
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Folgende Schleife verkürzt Quelltext, wenn viele Objekte gleichen Typs erzeugt
		//werden soll
		for(int i=0;i<5;i++) {
			JButton button = new JButton();
			button.addActionListener(this);
			button.setText(str[i]);
			buttons.add(button);
			add(button); }
		
		pack(); }
	
	@Override
	public void actionPerformed(ActionEvent event) {
		String cmd = event.getActionCommand();
		/*
		 * Nachfolgende Schleife schaut, welcher Button der erstellten Buttonliste gedrückt wurde
		 */
		for(int i=0;i<buttons.size();i++){
			if(cmd.equals(buttons.get(i).getText())) {

				switch(i){
					case 0: {frame2.setLayout(null); 
					/*
					 * Willkürliche Angaben von x, y, breite und höhe möglich, aber viel Quellcode
					 * und keine automatische Anpassung
					 */
								buttons2.get(0).setBounds(  0,   0,  100, 20);
								buttons2.get(1).setBounds( 20,  30,  100, 20);
								buttons2.get(2).setBounds(100,  20,  100, 20);
								buttons2.get(3).setBounds( 10,  70,  100, 20);
								buttons2.get(4).setBounds(200, 150,  100, 20);
								frame2.add(buttons2.get(0));
								frame2.add(buttons2.get(1));
								frame2.add(buttons2.get(2));
								frame2.add(buttons2.get(3));
								frame2.add(buttons2.get(4));
								frame2.setSize(500,300); break;}
					case 1: {frame2.setLayout(new FlowLayout());			frame2.pack(); break;}
					/*
					 * Alles in einer Reihe, automatische Anpassung der Größe der der Objekte bei
					 *  Veränderung der Größe des Frames
					 */
					case 2: {frame2.setLayout(new BorderLayout());	
					/*
					 * Nach Bedarf in die Himmelsrichtungen einzuteilen
					 */
								frame2.add(buttons2.get(0),BorderLayout.WEST);
								frame2.add(buttons2.get(1),BorderLayout.EAST);
								frame2.add(buttons2.get(2),BorderLayout.NORTH);
								frame2.add(buttons2.get(3),BorderLayout.SOUTH);
								frame2.add(buttons2.get(4),BorderLayout.CENTER);
								frame2.pack(); break;}
					case 3: {frame2.setLayout(new GridLayout(3,2));			frame2.pack(); break;}
					case 4: {frame2.setLayout(new GridLayout(3,2,10,10));	frame2.pack(); break;}}}}}}
```


----------



## elischa (26. Sep 2014)

huhu, tytychen für die Beispiele  bin die hier einbischen am nachcoden aber is immer noch recht tricky mit den Layouts irgendwie. Ich kriege beim Null-Layout 'ne Überlagerung, der base dark-gray JFrame Layer unten wird vollständig? vom Panel oben mit dem wheee Knopf überlagert, warum krieg ich da nen light-gray Layer rein obwohl der Layer mit dem Panel und Whee Knopf doch zurechtgeschnitten ist. Imho müsst ich doch bei dem folgenden Code grün auf dunkelgrau sehen oder ? 
	
	
	
	





```
package mischmasch;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/*
 *  Null-Layout
 */

public class PanelOnFrame extends JFrame implements ActionListener {
    
    private static final long serialVersionUID = 1L;
    
    private String b01com = "b01com";
    private JPanel lilPanel;
    private JButton b01;
    
    public PanelOnFrame() {
        
        super("Framename");
        setLayout(null);  // 1 Panel on 1 Frame
        setSize(400,300); // JFrame
        setBackground(Color.DARK_GRAY);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
        lilPanel = new JPanel();
        lilPanel.setSize(200,150); // JPanel
        lilPanel.setBackground (  new Color(123,212,32)  );
        lilPanel.setVisible(true);
        
        b01 = new JButton("whhheeeee :)");
        b01.setActionCommand(b01com);
        b01.addActionListener(this);    //  -> Listener horchen am b01 
                                        // und geben bei action das Ergebniss 
                                        // an den Empfänger JFrame zurück ?
        lilPanel.add(b01);
        add(lilPanel);
        
    } // constructor end
    
    private int git() { // returns a random red/green/blue code
        return (int)(Math.random()*255);
    }
    
    public void actionPerformed(ActionEvent ae) {
        if  ( ae.getActionCommand().equalsIgnoreCase("b01com") )  {
            lilPanel.setBackground(new Color(git(),git(),git()));
            System.out.println("Action detected !");
        }
    }
    
    public static void main(String[] args) {
        new PanelOnFrame();  // dunkelgrau, hellgrau grün ?      
    }

}
```

und dann habe ich noch beim FlowLayout folgendes Beispiel zusamm'getexted, da funzt eigentlich fast alles (momentan aber nur Ausgabe auf Konsole). Da hätt ich auch die Überlagerung von oben zum einen und  das setSize auf die 3 Panels funzt einfach nicht, ka warum und das mittlere Panel liefert keinen gscheiten Namen bei Klick


```
package mischmasch;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;


public class FlowLayoutTryout extends JFrame implements MouseListener {
    
    private static final long serialVersionUID = 1L;
    
    private JPanel myJPanel01;
    private JPanel myJPanel02;
    private JPanel myJPanel03;
    
    private static String echo = "";
    private static int positionX = -1;
    private static int positionY = -1;
    
    public FlowLayoutTryout() {
        
        super("Duper");
        setLayout(new FlowLayout()); // flow layout on global JFrame
        setSize(400,400); // JFrame
        setBackground(Color.MAGENTA); //JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //JFrame
        setVisible(true); //JFrame
                
        myJPanel01 = new JPanel();  // implicit default flow layout on JPanel? (see code completition help)
        myJPanel01.setName("myJPanel01");
        myJPanel01.setSize(100,100);
        myJPanel01.setBackground(new Color(12,54,125));
        myJPanel01.addMouseListener(this); // listener l listening on myJPanel for events,
                                           // Ausloeser: myJPanel01 | Empfänger: ? | Trigger: Listener l (this) | Richtung: -->? 
        myJPanel01.setVisible(true);
        
        add(myJPanel01); // JFrame
        
        myJPanel02 = new JPanel();
        myJPanel01.setName("myJPanel02");
        myJPanel02.setSize(100,100);
        myJPanel02.setBackground(new Color(120,35,233));
        myJPanel02.addMouseListener(this);
        myJPanel02.setVisible(true);
        
        add(myJPanel02); // JFrame
        
        
        myJPanel03 = new JPanel();
        myJPanel03.setName("myJPanel03");
        myJPanel03.setSize(100,100);
        myJPanel03.setBackground(new Color(85,235,61));
        myJPanel03.addMouseListener(this);
        myJPanel03.setVisible(true);
        
        add(myJPanel03); // JFrame
        
    } // end of constructor
    
    public void mouseClicked(MouseEvent moe) {
        if (  moe.getSource().equals(myJPanel01)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel01, positionX, positionY);
            System.out.println(echo);
        }
            
        if (  moe.getSource().equals(myJPanel02)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel02, positionX, positionY);
            System.out.println(echo);
        }
        if (  moe.getSource().equals(myJPanel03)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel03, positionX, positionY);
            System.out.println(echo);
        }
    }
    
    public void mouseEntered(MouseEvent arg0) {}
    public void mouseExited(MouseEvent arg0) {}
    public void mousePressed(MouseEvent arg0) {}
    public void mouseReleased(MouseEvent arg0) {}
    
    
    private String startHandler(JPanel panel, int x, int y) {
        return "Hey ! U are on Panel "+panel.getName()+"\n (x/y) = "+"("+x+"/"+y+")";     
    }
    
    public static void main(String[] args) {
        @SuppressWarnings("unused")
        FlowLayoutTryout myFLT01 = new FlowLayoutTryout();
    }
}
```

und dann eiere ich noch ein wenig mit den Listener rum.
Insgesamt klappt's aber schon ab und zu hier und da, müsst noch bisken üben aber geht auf jeden.
Wenn jemand iwo noch 'nen Tip hat immer her damit 

Gruß elischa


----------



## elischa (26. Sep 2014)

hab noch ein wenig dran rumgefeilt, setSize geht wohl beim FlowLayout dann nicht mehr, weil automatisch 'nen pack gemacht wird und außer dem Panel kein quasi größeres Objekt enhalten ist. Mit 'nem Null-Layout geht's dann wieder =)
Und die Listener hab ich mir grad so zurechtgebogen xD  panel ------>  L = this = JFrame   Die beim panel registriert sind aber im Jframe sind und nen Event empfangen. Hier nochma die Codeschnippsel, bleibt eigentlich nur noch die Überlagerung am Anfang.


```
package mischmasch;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class NullLayoutTryout extends JFrame implements MouseListener {
    
    private static final long serialVersionUID = 1L;
    
    private JPanel myJPanel01;
    private JPanel myJPanel02;
    private JPanel myJPanel03;
    
    private static String echo = "";
    private static int positionX = -1;
    private static int positionY = -1;
    
    public NullLayoutTryout() {
        
        super("Duper");
        setLayout(null); // flow layout on global JFrame
        
        setSize(400,400); // JFrame
        setBackground(Color.MAGENTA); //JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //JFrame
        setVisible(true); //JFrame
                
        myJPanel01 = new JPanel();  // implicit default flow layout on JPanel
        myJPanel01.setLayout(null); // ueberschreibe
        myJPanel01.setLocation(0,0);
        myJPanel01.setName("myJPanel01");
        myJPanel01.setSize(100,100);
        myJPanel01.setBackground(new Color(12,54,125));
        myJPanel01.addMouseListener(this); 
        myJPanel01.setVisible(true);
        
        add(myJPanel01); // JFrame
        
        myJPanel02 = new JPanel();
        myJPanel02.setLayout(null);
        myJPanel02.setLocation(100,0);
        myJPanel02.setName("myJPanel02");
        myJPanel02.setSize(100,100);
        myJPanel02.setBackground(new Color(120,35,233));
        myJPanel02.addMouseListener(this);
        myJPanel02.setVisible(true);
        
        add(myJPanel02); // JFrame
        
        
        myJPanel03 = new JPanel();
        myJPanel03.setLayout(null);
        myJPanel03.setLocation(200,0);
        myJPanel03.setName("myJPanel03");
        myJPanel03.setSize(100,100);
        myJPanel03.setBackground(new Color(85,235,61));
        myJPanel03.addMouseListener(this);
        myJPanel03.setVisible(true);
        
        add(myJPanel03); // JFrame
        
    } // end of constructor
    
    public void mouseClicked(MouseEvent moe) {
        if (  moe.getSource().equals(myJPanel01)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel01, positionX, positionY);
            System.out.println(echo);
        }
            
        if (  moe.getSource().equals(myJPanel02)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel02, positionX, positionY);
            System.out.println(echo);
        }
        if (  moe.getSource().equals(myJPanel03)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel03, positionX, positionY);
            System.out.println(echo);
        }
    }
    
    public void mouseEntered(MouseEvent arg0) {}
    public void mouseExited(MouseEvent arg0) {}
    public void mousePressed(MouseEvent arg0) {}
    public void mouseReleased(MouseEvent arg0) {}
    
    
    private String startHandler(JPanel panel, int x, int y) {
        return "Hey ! U are on Panel "+panel.getName()+"\n (x/y) = "+"("+x+"/"+y+")";     
    }
    
    public static void main(String[] args) {
        @SuppressWarnings("unused")
        NullLayoutTryout myFLT01 = new NullLayoutTryout();
    }
}
```


```
package mischmasch;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;


public class FlowLayoutTryout extends JFrame implements MouseListener {
    
    private static final long serialVersionUID = 1L;
    
    private JPanel myJPanel01;
    private JPanel myJPanel02;
    private JPanel myJPanel03;
    
    private static String echo = "";
    private static int positionX = -1;
    private static int positionY = -1;
    
    private JButton myJButton01;
    
    public FlowLayoutTryout() {
        
        super("Duper");
        setLayout(new FlowLayout()); // flow layout on global JFrame
        setSize(400,400); // JFrame
        setBackground(Color.MAGENTA); //JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //JFrame
        setVisible(true); //JFrame
        
        myJPanel01 = new JPanel();
        //myJPanel01.setLayout(null); 
        myJPanel01.setName("myJPanel01");
        //myJPanel01.setSize(100,100); // no effect, implicit pack to inner object
        myJPanel01.setBackground(new Color(12,54,125));
        myJPanel01.addMouseListener(this); // listener l in(this) JFrame instance 
              // myJPanel01 -> l           // is receiving events from sender/Ausloeser myJPanel01 
        
        myJPanel01.setVisible(true);
        
        add(myJPanel01); // JFrame
        
        myJPanel02 = new JPanel();
        //myJPanel02.setLayout(null);
        myJPanel02.setName("myJPanel02");
        //myJPanel02.setSize(100,100);
        myJPanel02.setBackground(new Color(120,35,233));
        myJPanel02.addMouseListener(this);
        
        
        myJButton01 = new JButton("Play!");
        myJPanel02.add(myJButton01);        
        
        myJPanel02.setVisible(true);
        add(myJPanel02); // JFrame
        
        
        myJPanel03 = new JPanel();
        //myJPanel03.setLayout(null);
        myJPanel03.setName("myJPanel03");
        //myJPanel03.setSize(100,100);
        myJPanel03.setBackground(new Color(85,235,61));
        myJPanel03.addMouseListener(this);
        myJPanel03.setVisible(true);
        
        add(myJPanel03); // JFrame
        
        
        
    } // end of constructor
    
    public void mouseClicked(MouseEvent moe) {
        if (  moe.getSource().equals(myJPanel01)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel01, positionX, positionY);
            System.out.println(echo);
        }
            
        if (  moe.getSource().equals(myJPanel02)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel02, positionX, positionY);
            System.out.println(echo);
        }
        if (  moe.getSource().equals(myJPanel03)  ) {
            positionX = moe.getX();
            positionY = moe.getY();
            echo = startHandler(myJPanel03, positionX, positionY);
            System.out.println(echo);
        }
    }
    
    public void mouseEntered(MouseEvent arg0) {}
    public void mouseExited(MouseEvent arg0) {}
    public void mousePressed(MouseEvent arg0) {}
    public void mouseReleased(MouseEvent arg0) {}
    
    
    private String startHandler(JPanel panel, int x, int y) {
        return "Hey ! U are on Panel "+panel.getName()+"\n (x/y) = "+"("+x+"/"+y+")";     
    }
    
    public static void main(String[] args) {
        @SuppressWarnings("unused")
        FlowLayoutTryout myFLT01 = new FlowLayoutTryout();
    }
}
```


----------



## jgh (26. Sep 2014)

> ...setSize geht wohl beim FlowLayout dann nicht mehr, weil automatisch 'nen pack gemacht wird


wahrscheinlich verstehe ich dich falsch, aber das Flowlayout verwendet die PreferredSize:

```
myJPanel01.setPreferredSize(new Dimension(100,100)); //
```


----------



## elischa (27. Sep 2014)

jup is halt grob geschnetzelt, aber die preferedSize grad noch auf gut Glück dynamisch vom Rechner rausgelesen und die Panels als Templates zurechtgeschubst, den Inhalt je bischen rumskalliert, bischen rumgeschraubt, nen quasi HelloWorld. Die dann noch Rückwärts  per Panel extend noch modulariesiert vielleicht machbar, ka wozu. Eigentlich den schwarzen Kasten transparent schalten, die Panels füllen, nen schönen Nimbus skin drauf und wenn ich mal zu dem repaint und threads komme, vielleicht noch die Datengravitation und Übergabe belichten, anhalten und per drag and drop auf der runtime live umleiten und den laufenden code on the fly stückweise compilieren während das Ende noch läuft, hmm das wird'n langer Abend noch, ich bild' mir iwie ein das des hammer fun macht


```
package gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class elementMain extends JFrame implements ActionListener {
    
    private static final long serialVersionUID = 1L;
    
    private JPanel myJPanel01;
    private JPanel myJPanel02;
    private JPanel myJPanel03;
    private JPanel myJPanel04;
    
    private JTextField myJTextField01;
    private JScrollPane myJScrollPane01;
    private JTextArea myJTextArea01;
    
    private JButton myJButton01;
    private JButton myJButton02;
    
    private String myACb01 = "myACb01";
    private String myACb02 = "myACb02";
    
    //private JTextArea myJTextArea01;
    
    public elementMain() {
        
        super("plus");
        setLayout(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setBackground(Color.DARK_GRAY);
        setSize(800,600);
        
        myJPanel01 = new JPanel();
        myJPanel01.setLayout(new GridLayout(3,3,20,20));
        myJPanel01.setSize(600,400);
        myJPanel01.setLocation(100,100);
        myJPanel01.setBackground(Color.BLACK);
        myJPanel01.setVisible(true);
        myJTextArea01 = new JTextArea(10,10);
        myJScrollPane01 = new JScrollPane(myJTextArea01);
        myJPanel01.add(myJScrollPane01);
        
        
        myJPanel02 = new JPanel();
        myJPanel02.setLayout(new FlowLayout());
        myJPanel02.setLocation(50,510);
        myJPanel02.setSize(300,40);
        myJPanel02.setVisible(true);
        myJPanel02.setBackground(Color.BLACK);
        myJTextField01 = new JTextField(20);
        myJPanel02.add(myJTextField01);
        
        
        myJPanel03 = new JPanel();
        myJPanel03.setLayout(new FlowLayout());
        myJPanel03.setLocation(20, 20);
        myJPanel03.setSize(200,100);
        myJPanel03.setVisible(true);
        myJPanel03.setBackground(Color.BLACK);
        myJButton01 = new JButton("Knopf 1");
        myJButton01.setActionCommand(myACb01);
        myJButton01.addActionListener(this);
        myJPanel03.add(myJButton01);
        myJButton02 = new JButton("Knopf 2");
        myJButton02.setActionCommand(myACb02);
        myJButton02.addActionListener(this);
        myJPanel03.add(myJButton02);
                
        add(myJPanel01);
        add(myJPanel02);
        add(myJPanel03);
        
    }
    
    private void resizeAll(int teiler) {
        Dimension d = new Dimension();
        int tempdpi = (int) (Toolkit.getDefaultToolkit().getScreenResolution());
        Component[] con = new Component[this.getContentPane().getComponentCount()];
        con = this.getContentPane().getComponents();
        int i = 0;
        while(i<= con.length-1) {
            if (con[i].isDisplayable()) {
                myJTextArea01.append("\n"+" at: "+con[i].getLocation().getX()+"/"+con[i].getLocation().getY()+" size: "+con[i].getSize().getWidth()+"/"+con[i].getSize().getHeight()+" element: "+con[i].getClass().toString()+"\n");
             i++; 
            }
            myJTextArea01.append("\n"+"dpi: "+tempdpi);
        }
    }
    
    public void actionPerformed (ActionEvent ae) {
        if (ae.getActionCommand().equals("myACb01")) {
            myJTextField01.setText("found: "+myJTextField01.getBackground());
            myJTextArea01.append(System.getProperties()+"\n"+myJTextField01.getRootPane()+"\n");
            
        }
        if ((ae.getSource().equals(myJButton02))) {
            
            myJTextArea01.append("  "+"\n"+System.currentTimeMillis()+"\n");
            this.getContentPane().setSize(new Dimension(400,300));
            myJPanel01.setSize((int )myJPanel01.getSize().getWidth()/2,(int )myJPanel01.getSize().getHeight()/2);
            myJPanel02.setSize((int )myJPanel02.getSize().getWidth()/2,(int )myJPanel02.getSize().getHeight()/2);
            myJPanel03.setSize((int )myJPanel03.getSize().getWidth()/2,(int )myJPanel03.getSize().getHeight()/2);
            //myJTextArea01.setText("new Area values: "+myJPanel01.getSize().getWidth()+"/"+myJPanel01.getSize().getHeight());
            resizeAll(2);
        }
    }
    
    
    public static void main (String[] args) {
        new elementMain();
    }
    
}
```


----------



## elischa (1. Feb 2015)

Hallo,

also ich habe jetzt 2 Mini-Templates hinbekommen, aber mit der Nebenläufigkeit tu' ich mich noch iwie schwer. Im 3. Beispiel habe ich versucht paar Punkte nacheinander zu zeichnen und die Daten zu ziehen per Timer, verliere aber das JTextField bei der Darstellung. Vielleicht mag jemand drüberschauen...Außerdem habe ich da ein Update auf dem Swing Thread im ActionListener (warum ist der nicht registriert und wo hänge ich den an ?). Wenn ich das Update in den leeren Runnable unten verschiebe, der dann weitergibt an Dispatcher, habe ich keine bewegten Punkte. Dann wollt ich noch versuchen das root JFrame Fenster, obwohl's ja schon nebenläufig ist, auch in einen eigenen Thread zu legen. Müsst' ich dann auch über extra Runnable und Dispatcher ? Die paar Comments drinne, kann man eigentlich vernachläßigen, is' halt so geschrieben wie ich's grad verstanden habe. Also eigentlich will ich 'ne einfache Methode um in die Gui etwas nachzuladen und zu zeichnen. Würde mich über ein paar Tipps freuen. Gruß
1.)
---
[Java]import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Gui01 extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;

    private Container con;
    private JPanel p1,p2;
    private JButton[] bA;

    public Gui01() {
        super("MainFrame");
        setLayout( new BorderLayout() );
        setSize(1024,768);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        con = getContentPane(); con.setBackground(Color.WHITE);

        p1 = new JPanel(); p1.setBackground(Color.DARK_GRAY);
        p2 = new JPanel(); p2.setBackground(Color.BLACK);

        bA = new JButton[2];
        for (int i = 0; i <= bA.length-1; i++) {
            bA_ = new JButton("Button0"+i);
            bA.addActionListener(this);
            p2.add(bA);
        }
        p1.setVisible(true); p2.setVisible(true);
        con.add(p1,BorderLayout.WEST); con.add(p2, BorderLayout.EAST);

        setVisible(true);        
    }

    public void actionPerformed(ActionEvent ae) {
        if ( ae.getSource().equals(bA[0])  ) {
            System.out.println( ae.getActionCommand()+" fired !" );
        }
        if ( ae.getSource().equals(bA[1])  ) {
            System.out.println( ae.getActionCommand()+" fired !" );
        }
    }


    public static void main(String[] args) {
        new Gui01();

    }

}[/Java]
2.)
----
[Java]
import java.awt.Color;
import java.awt.Container;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Gui02 extends JPanel {
    private static final long serialVersionUID = 1L;

    private JPanel p;

    private JFrame frame;
    private WindowAdapter wa;
    private Container con;

    public Gui02() {

        setBackground(Color.DARK_GRAY);
        setSize(800,600);
        add( new JTextField("FieldText", 20) );
        p = new JPanel();
        p = this; p.setVisible(true);


        frame = new JFrame("MainFrame");
        frame.setSize(1024,768); 

        con = frame.getContentPane();
        con.setLayout(null);
        con.setBackground(Color.WHITE);


        con.add(p); con.setVisible(true);


        wa = new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                if (true) 
                  {  System.out.println("...exit."); System.exit(0);  }
            }
        };
        frame.addWindowListener(wa);


        frame.setVisible(true);
    }


    public static void main(String[] args) {
        new Gui02();
    }

}[/Java]
3.)
---[Java]
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GuiMain {

    private JFrame frame;
    private Container con;

    public GuiMain() {
        frame = new JFrame();
        frame.setSize(1024,768);
        frame.setLayout( new BorderLayout() );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        con = frame.getContentPane();

        JButton b01 = new JButton("Play!");

        b01.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent ae) {

                System.out.println(   ae.getActionCommand()   );


                con.add( new CustomPanel( ), BorderLayout.CENTER );

            }
        }
        );
        con.add( b01, BorderLayout.EAST);

        frame.setVisible(true);
    }

}



import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class CustomPanel extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;

    private JTextField jtf;
    private ActionListener al;
    private Timer timer;
    private static final int freeze = 500;
    private int counter = 0;


    private Runnable r;

    public CustomPanel() {

        setSize(900,600);
        setLayout(new FlowLayout());
        setBackground(Color.GREEN);

        jtf = new JTextField("", 50);
        add(jtf);


        // on fire: pull current counter stat and update this swing runnable
        al = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                jtf.setText("catched frame..." + String.valueOf( counter) );
                repaint();
                jtf.repaint();
            }
        };


        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void run() {

        r = new Runnable() { // r = this ?
            public void run() {
                // update protected swing runnable ?
            }
        };

        // auto-fire event every 500 ms
        timer = new Timer(freeze,al);
        timer.start();

        // not slowed
        while (true) {

            counter++;
            System.out.println(counter);

            try { // this swing r protected by dispatcher
                SwingUtilities.invokeAndWait(r);
            }
            catch (Exception e) { // thread not running or sth. in dispatcher
                System.err.println(e);
            }

        }

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(counter/10000, counter/10000, 10, 10);
    }

}



public class GuiRunner {

    public static void main(String[] args) {
        new GuiMain();

    }

}[/Java]_


----------



## elischa (2. Feb 2015)

hat jetzt doch geklappt, den Haupt JFrame aus der GuiMain an CustomPanel bei Instanzierung mit übergeben und in der CustomDatei dann diese JFrame Referenz im ActionListener am Ende nochmal Visible machen.


----------



## Flown (2. Feb 2015)

Möchtest du gerne Verbesserungsvorschläge für alle deine Programme haben?


----------



## Thallius (2. Feb 2015)

Newcomer2 hat gesagt.:


> Hallo elischa,
> 
> in deinem Konstruktor kannst du erstmal das
> 
> ...



Das finde ich einen blöden Tipp. Es ist sehr löblich bei jedem Zugriff auf eine Instanzenvariable this zu verwenden. Das erleichtert das Lesen des Codes ungemein und beugt doofen Fehlern vor wenn man mal aus versehen eine lokale Variable genauso nennt wie eine IInstanzvariable.

Gruß

Claus


----------



## elischa (7. Feb 2015)

ehm sry kann da nur unregelmäßig dran arbeiten, Klausurenphase und so...
Aber Verbesserungsvorschläge und so nehme ich auf jeden auch gern. Das mit dem this habe ich auch noch nicht ganz verinnerlicht. Ich dachte ich referenziere damit immer die aktuell laufende Instanz (und es wäre möglicherweise leserlicher wenn es drin ist). Aber ich glaube da ist noch mehr in "this". Muss ich noch genauer durcharbeiten.


----------



## Ruzmanz (7. Feb 2015)

> Das finde ich einen blöden Tipp. Es ist sehr löblich bei jedem Zugriff auf eine Instanzenvariable this zu verwenden. Das erleichtert das Lesen des Codes ungemein und beugt doofen Fehlern vor wenn man mal aus versehen eine lokale Variable genauso nennt wie eine IInstanzvariable.



"this." wegzulassen, weil man es weglassen kann ... ist keine gute Begründung. Ich verwende "this" auch nicht. Sehe darin keinen Mehrwert, da die IDEs den lokalen Variablen und Instanzvariablen andere Farben geben. Methoden sollten zudem mMn so kurz gehalten werden, dass selbst im Texteditor keine Verwechslung möglich ist. Es hat sich (zeitweise) das "m_" Präfix vor Instanzvariablen durchgesetzt. Eclipse bietet die Möglichkeit einen Instanzvariablen-Präfix zu setzen, sodass bei der Entwicklung (Generierung von Gettern und Settern etc.) keine Nachteile entstehen. Das Präfix ist deutlich kürzer als "this." und dadurch leserlicher, evtl. sicherer. Eine Instanzvariable bei der man das "m_" vergessen hat, fällt schnell auf. Sollte mal das "this." fehlen, wird der Fehler (mMn) nicht so schnell bemerkt. Gegen "m_" und "this." spricht, dass man sich in falscher Sicherheit wiegt. Immerhin geht man davon aus, dass es sich um lokale Variabeln handelt, sofern das "m_" und "this." nicht vorhanden ist. Das wurde zwar per Konvention festgelegt, interessiert den Java Compiler nur bedingt. (Muss zugeben, dass ich nicht genau weis, ob es Toolunterstützung für "this." vor Instanzvariablen gibt, dann würde die Sache widerum ein bisschen anders aussehen).

Sicherheit? Sehe ich bei keinen der drei Varianten. Lesbarkeit? Ohne "this." und "m_" werden lokale Variablen und Instanzvariablen kurz und farblich hervorgehoben.

Fazit: Da ich in keinem Projekt die Konvention (ohne, "this" oder "m_") geändert habe, hebt sich mMn keiner der drei Varianten deutlich ab. Somit sollte man in einem Projekt die Konvention einfach nur konsequent befolgen.


----------



## Thallius (7. Feb 2015)

Ruzmanz hat gesagt.:


> "this." wegzulassen, weil man es weglassen kann ... ist keine gute Begründung. Ich verwende "this" auch nicht. Sehe darin keinen Mehrwert, da die IDEs den lokalen Variablen und Instanzvariablen andere Farben geben....



Eclipse macht das Defaultmäßig nicht. Du kannst also nicht davon ausgehen das es bei allen so ist nur weil Deine IDE das macht.

Gruß

Claus


----------

