# Sauberer Gui-Code?



## JavaMeetsBlueJ (14. Aug 2012)

Hallo Java-Forum,
ich bin jetzt schon seit ein paar Monaten dabei, mit Java Programme zu schreiben und so langsam wird's Zeit den Schand-Stil niederzulegen und sauberen Code zu fabrizieren. Ich habe hier jetzt eine kleine GUI gamacht und möchte von euch wissen, wie man sowas wirklich gut macht.

Folgende Sachen sind mir bekannt:
-kein setVisible() in den Konstruktor, sondern nur in den Caller
-exetends JFrame implements ActionListener = Strom abstellen, Programmierverbot für immer
-Komponenten gehören wie immer private
-klare Variablenbezeichnungen

Bei dem Versuch das alles zu berücksichtigen ist irgendwie was schiefgelaufen glaube ich. Ich habe keinen Konstruktor, weshalb alle Komponenten static sind(habe ich noch nirgends vorher gesehen :autsch.

Wie realisiere ich das wenn ich mehrere Fenster in einem Programm habe(Die main-Methode ist so vollgeballert:'()


```
import java.awt.BorderLayout;
import java.awt.GridLayout;

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


public class Main {

	private final static GridLayout komponentLayout = new GridLayout(4,2);
	private final static BorderLayout fensterLayout  = new BorderLayout();
	
	private final static JPanel  hintergrund = new JPanel();
	private final static JPanel komponenten = new JPanel();
	private final static JPanel steuerung = new JPanel();
	
	private final static JTextField edtvorname = new JTextField();
	private final static JTextField edtnachname = new JTextField();
	private final static JTextField edttelNummer = new JTextField();
	private final static JTextField edtpostleitzahl = new JTextField();
	
	private final static JLabel vorname = new JLabel("Vorname: ");
	private final static JLabel nachname = new JLabel("Nachname: ");
	private final static JLabel telNummer = new JLabel("Telefonnummer: ");
	private final static JLabel postleitzahl = new JLabel("Postleitzahl: ");
	
	private final static JButton speichern = new JButton("Speichern");
	
	
	public static void main(String[] args) {
		

		JFrame fenster = new JFrame();
		
		
			
		fenster.setSize(500,300);
		fenster.setTitle("Daten");
		fenster.setResizable(false);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		fenster.add(hintergrund);
		
		hintergrund.setLayout(fensterLayout);
		hintergrund.add(komponenten, BorderLayout.CENTER);
		hintergrund.add(steuerung, BorderLayout.SOUTH);
		
		komponenten.setLayout(komponentLayout);
		komponenten.add(vorname);
		komponenten.add(edtvorname);
		
		komponenten.add(nachname);
		komponenten.add(edtnachname);
		
		komponenten.add(telNummer);
		komponenten.add(edttelNummer);
		
		komponenten.add(postleitzahl);
		komponenten.add(edtpostleitzahl);
		
		steuerung.setLayout(new BorderLayout());
		steuerung.add(speichern, BorderLayout.EAST);
		
		
		fenster.setVisible(true);
	
		
		
	}

}
```

MfG


----------



## pl4gu33 (14. Aug 2012)

warum alles static und in der main? Das hättest du auch alles in eine Klasse packen können/müssen/sollen !  

und eine andere Regel noch(hast du hier nicht verletzt aber nur btw.) kein Swing und AWT mischen


----------



## Evil-Devil (14. Aug 2012)

Du kannst und solltest deine GUI Creation in eigene Methoden auslagern. Das spart viel Code 

Zb.


```
public class BubbleModelViewer {
    
    private final String APP_TITLE = "Bubble Model Viewer";
    //private final Dimension DEFAULT_APP_SIZE = new Dimension(1000,600);
    private final String APP_ABOUT_IMAGE_NAME = "resources/Bubble_Engine_Logo_Small.png";
    private final float APP_VERSION = 1.0f;

   
    private JFrame mvFrame = null;    
    private AWTOpenGLCanvas awtOGLCanvas = null;
    private JMenuBar mvMenuBar = null;
    
    private final JCheckBox autoRot = new JCheckBox();
    private final JCheckBox autoRotX = new JCheckBox();
    private final JCheckBox autoRotY = new JCheckBox();
    private final JCheckBox autoRotZ = new JCheckBox();
    private final JSlider rotXSpeed = createControlSlider(-100,100,0,10,5);
    private final JSlider rotYSpeed = createControlSlider(-100,100,0,10,5);
    private final JSlider rotZSpeed = createControlSlider(-100,100,0,10,5);
    private final JSlider moveXSpeed = createControlSlider(-100,100,0,10,5);
    private final JSlider moveYSpeed = createControlSlider(-100,100,0,10,5);
    private final JSlider moveZSpeed = createControlSlider(-100,100,0,10,5);
    private final JTextField rotX = new JTextField("0");
    private final JTextField rotY = new JTextField("0");
    private final JTextField rotZ = new JTextField("0");
    private final JTextField moveX = new JTextField("0");
    private final JTextField moveY = new JTextField("0");
    private final JTextField moveZ = new JTextField("0");
    private final JCheckBox reset = new JCheckBox();
    final JCheckBox texturing = new JCheckBox();
    final JCheckBox wireframe = new JCheckBox();
    final JCheckBox lighting = new JCheckBox();
    
    public BubbleModelViewer() {        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    private void createAndShowGUI() {
        mvFrame = new JFrame(this.APP_TITLE);        
        mvFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // add menu
        mvFrame.setJMenuBar(createModelViewerMenu());

        JPanel mvPanel = new JPanel();          // becomes our ContentPane
        JPanel displayPanel = new JPanel();     // will hold the GLCanvas
        JPanel toolPanel = new JPanel();        // takes our tools        
        JPanel consolePanel = new JPanel();     // takes our output console
        JPanel renderAutoPanel = new JPanel();
        renderAutoPanel.setLayout(new BoxLayout(renderAutoPanel,BoxLayout.LINE_AXIS));
        renderAutoPanel.add(createRenderingPanel());
        renderAutoPanel.add(Box.createRigidArea(new Dimension(8,0)));
        renderAutoPanel.add(createAutoRotationPanel());
        
        // mvPanel setup
        mvPanel.setLayout(new BoxLayout(mvPanel,BoxLayout.LINE_AXIS));
        
        // displayPanel setup
        displayPanel.setLayout(new BorderLayout());        
        displayPanel.setMaximumSize(new Dimension(640,480));        
        try {            
            awtOGLCanvas = new AWTOpenGLCanvas(new ModelViewerRenderer());
            awtOGLCanvas.setSize(640,480);
            // init the scene data
        } catch (LWJGLException lwjgle) {
            lwjgle.printStackTrace();
        }
        displayPanel.add(awtOGLCanvas,BorderLayout.CENTER);
        
        // toolPanel setup
        toolPanel.setLayout(new BoxLayout(toolPanel,BoxLayout.PAGE_AXIS));
        toolPanel.setBorder(new EmptyBorder(2,4,2,2));
        toolPanel.add(renderAutoPanel);
        toolPanel.add(Box.createRigidArea(new Dimension(0,9)));
        toolPanel.add(createMovementPanel());
        toolPanel.add(Box.createRigidArea(new Dimension(0,9)));
        toolPanel.add(createRotationPanel());;        
        
        // add everything
        mvPanel.add(displayPanel);
        mvPanel.add(toolPanel);        
        mvFrame.getContentPane().add(mvPanel);
        
        // pack it and set the position
        mvFrame.pack();
        mvFrame.setLocation(Screen.getCenteredTopLeftPosition(mvFrame.getSize()));
        
        // Display the stuff
        mvFrame.setResizable(false);
        
        awtOGLCanvas.setVisible(true);
        mvFrame.setVisible(true);        
    }
[...]

    private JButton createControlButton(String title) {
        final JButton button = new JButton(title);
        // we want small buttons ^_^
        button.setMargin(new Insets(1,8,0,8));
        
        return button;
    }
    
    private JSlider createControlSlider(int min, int max, int start,int major, int minor) {
        final JSlider slider = new JSlider(min,max,start);
        final Hashtable<Integer,JLabel> sliderTexts = new Hashtable<Integer,JLabel>();
        sliderTexts.put(min,new JLabel(Float.toString(min/major)));
        sliderTexts.put(start,new JLabel(Float.toString(start)));
        sliderTexts.put(max,new JLabel(Float.toString(max/major)));
        
        slider.setMajorTickSpacing(major);
        slider.setMinorTickSpacing(minor);
        slider.setLabelTable(sliderTexts);        
        slider.setPaintTicks(true);
        slider.setPaintTrack(true);
        slider.setPaintLabels(true);
        return slider;
    }
    
    private JMenuBar createModelViewerMenu() {
        final JMenuBar bar = new JMenuBar();
        JPopupMenu.setDefaultLightWeightPopupEnabled(false);    // disable leightweight
        JMenu menu = new JMenu("File");        
        JMenuItem item = new JMenuItem("Open");
        item.addActionListener(new OpenAction(this));
        menu.add(item);
        item = new JMenuItem("Preferences");
        item.addActionListener(new PreferencesAction(this));
        menu.add(item);
        item = new JMenuItem("Take Screenshot");
        item.addActionListener(new ScreenShotAction());
        menu.add(item);
        item = new JMenuItem("Exit");
        item.addActionListener(new ExitAction(this));
        menu.add(item);
        bar.add(menu);
        menu = new JMenu("?");
        item = new JMenuItem("About");
        item.addActionListener(new AboutAction(this));
        menu.add(item);
        bar.add(menu);
        JPopupMenu.setDefaultLightWeightPopupEnabled(true);     // enable leightweight
        return bar;
    }
[...]
}
```


----------



## JavaMeetsBlueJ (14. Aug 2012)

Ich habs halt immer so gemacht, dass ich die Klasse von JFrame erben lassen habe, die die Gui machen sollte und jetzt steh ich halt aufm Schlauch wie ichs anders machen soll. Das mit der Main habe ich vorher auch noch nie so gemacht. Also macht man es fogendermaßen: Ich habe die Klasse Fenster. dann kommt da alles rein wie JFrame.setTitle() ec. und in der Main erzeuge ich dann ein Objekt der Klasse Fenster und dann kommt da halt noch namedesfensters.setVisible(true) hin. Worinbesteht der Vorteil, die erzeugung und die Anzeige in Methoden zu unteteilen?

MfG


----------



## Deception (14. Aug 2012)

Hey,
schwer zu sagen! Schönen Oberflächen Code habe ich glaub ich noch nicht gesehen, bin also auch für Beispiele echt dankbar! Was mir noch nicht klar ist, weil das aus deinen Aussagen nicht ganz klar erkennbar ist:
Kennst du Architektur Pattern wie z.b. Model-View-Controller, Model-Viel-Presenter, View-Model-Model-View oder ähnlichem? 
Ansonsten ist wie immer Abstraktion wichtig. Schaue was für ein Programm du bauen willst, überlege was du wieder verwenden kannst, schreibe dir eigene Dialoge, die weniger Code benötigen, aber gut erweiterbar sind (Wow klingt das Simpel ).
Meine Hass-Objekte sind Layouts. Könnt ich echt vor abhauen! Aber wenn man ein einheitliches Layout will, kann man hier sehr viel abstrahieren, so dass unter Umständen für spätere Fenster kein Layouten mehr nötig ist. Aber ausreißer aus dieser Konvention können dann schwer werden. 
Ach alles nicht so einfach...  
Beste Grüße,
Jens


----------



## vanny (14. Aug 2012)

JavaMeetsBlueJ hat gesagt.:


> ... Worinbesteht der Vorteil, die erzeugung und die Anzeige in Methoden zu unteteilen?...



Das ist so immernoch ziemlich welsch, was du da schreibst/verstehst.
Java ist OOP und sollte nach Möglichkeit auch so genutzt werden.
In bezug auf den JFrame(das Fenster) macht der erstmal nichts anderes als sich zu öffnen und deine Programmoberfläche anzuzeigen. Großartig logik gehört da i.d.R. nicht hinein.
Also kannste den in der main(); erzeugen und deine eigentliche Programmoberfläche reinpacken.
Diese sollte dann auch irgendwie so programmiert sein, dass der JFrame sie anzeigen kann.

Um so komplexer dann deine GUI wird um so häufiger wirst du dann einzelne Komponenten erstellen(Klassen und davon dann Objekte). Die allround-Lösung gibt es nicht.

Wichtig ist, dass du dich mit den Basics auskennst und weisst was die Modifier machen, was Instanzen, Referenzen, Methoden etc. wirklich sind und machen.

Dein Code oben zeigt, dass es leider noch nicht so ist.

Gruß Vanny


----------



## JavaMeetsBlueJ (15. Aug 2012)

vanny hat gesagt.:


> Wichtig ist, dass du dich mit den Basics auskennst und weisst was die Modifier machen, was Instanzen, Referenzen, Methoden etc. wirklich sind und machen.
> Gruß Vanny



Ist so, nur aus dem Post wird es nicht ersichtlich, das war nur so dahin geballert, weil jeder zu dem Thema was anderes zu sagen hat und ich halt mit der be******ensten Lösung angekommen bin, weil ich ausnahmsweise auf das so heiß diskutierete extends JFrame verzichten wollte  

MfG


----------



## mla.rue (15. Aug 2012)

JavaMeetsBlueJ hat gesagt.:


> [...]
> -exetends JFrame implements ActionListener = Strom abstellen, Programmierverbot für immer
> [...]



dasda erschließt sich mir nicht so recht (hat jemand in deinem letzten Thread geschrieben ja).

: implements ActionListener ... ja, weg damit

: extends JFrame ... wieso nicht? Man lässt eine Klasse nicht nur erben, um "neue Funktionalität" einzubauen, sondern um vorhandene Methoden nutzen zu können

Beispiele:

```
//mit extends JFrame
public class PAD {

    public static void main(String[] args) {
		new GUI_PAD().setVisible(true);
    }
}

public class GUI_PAD extends javax.swing.JFrame {

    public GUI_PAD() {
        initComponents();
    }
  
    private void initComponents() {
        //tobe
        //dich
        //hier
        //aus
    }
}

//ohne extends JFRame
public class PAD {

    public static void main(String[] args) {
        new GUI_PAD(); //wenn konstruktor benutzt
        //wenn keinen konstruktor hast
	//GUI_PAD window = new GUI_PAD(); 
        //window.initComponents();
    }
}

public class GUI_PAD {

    public GUI_PAD() {
        initComponents();
    }
  
    private void initComponents() {
        //tobe
        //dich
        //hier
        //aus
        frame.setVisible(true);
    }
}

//optionaler und alternativer Code der Übersichtshalber entfernt
```

Habe noch nie eine grössere GUI Anwendung gesehen, wo das frame inder eigenen GUI Klasse visible gesetzt wird, sondern immer außerhalb (z.B. main, welche die GUI startet), damit das geht, muss? die GUI Klasse also von JFrame erben (wenn es doch irgendwie geht, mag man mich an der Stelle bitte korrigieren).

Wie auch immer. Ein "macht man nicht" ist ein 0-Argument wenn es nicht erklärt wird. Und ein "nur wenn du die Klasse erweitern willst" ist, denke ich, falsch.


----------



## Kar (15. Aug 2012)

mla.rue hat gesagt.:


> Habe noch nie eine grössere GUI Anwendung gesehen, wo das frame inder eigenen GUI Klasse visible gesetzt wird, sondern immer außerhalb (z.B. main, welche die GUI startet), damit das geht, muss? die GUI Klasse also von JFrame erben (wenn es doch irgendwie geht, mag man mich an der Stelle bitte korrigieren).
> 
> Wie auch immer. Ein "macht man nicht" ist ein 0-Argument wenn es nicht erklärt wird. Und ein "nur wenn du die Klasse erweitern willst" ist, denke ich, falsch.




```
public class GUI {
  private JFrame frame;
  
  [...]

  public void setVisible(boolean b) {
    frame.setVisible(b);
  }
}
```


```
[...]
GUI g = new GUI();
g.setVisible(true);
```


----------



## Gast2 (15. Aug 2012)

mla.rue hat gesagt.:


> : extends JFrame ... wieso nicht? Man lässt eine Klasse nicht nur erben, um "neue Funktionalität" einzubauen, sondern um vorhandene Methoden nutzen zu können



Aggregation ist Vererbung immer vorzuziehen!


----------



## mla.rue (15. Aug 2012)

Und warum?


----------



## Gast2 (15. Aug 2012)

Wenn man etwas nur benutzt sollte man das genutzte und nur einbinden (Aggregation) und nicht erweitern (Vererbung). BEachtet man diesen Grundsatz nicht bekommt man zum einen viel komplexere Abhängigkeiten, Die Wiederverwendbarkeit wird eingeschränkt (Möchte man später etwas anderes benutzen hat aber eine Vererbung vorgenommen sind weitaus mehr Änderungen von nöten) und man riskiert den Deadly diamond of death (In Java natürlich nicht da es keine Mehrfachvererbung gibt)


----------



## JavaMeetsBlueJ (15. Aug 2012)

> damit das geht, muss? die GUI Klasse also von JFrame erben (wenn es doch irgendwie geht, mag man mich an der Stelle bitte korrigieren).



So seh ich das nämlich auch. Wenn ich das folgendermaßen mache komme ich ehrlich gesagt nicht weiter.


```
import javax.swing.JFrame;


public class Gui {

	JFrame fenster = new JFrame();
	public Gui()
	{
	fenster.setTitle("Ohne extends JFrame :)");
	fenster.setSize(300,500);
	fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
}
```
 
1.Wenn man jetzt ein Objekt von Gui erzeugt, wird gleichzeitig noch eines von JFrame erzeugt...kann irgendwie nicht so richtig sein.

2. Wie setzte ich das jetzt in der Main visible? So geht's wohl schlehct, weil Gui setVisible() nicht kennt(Stichwort extends)

```
import javax.swing.JFrame;


public class Main {

	public static void main(String[] args)
	{
	Gui frame = new Gui();
	frame.setVisible(true);
	}
}
```


Möge man mich und alle anderen unwissenden auf den rechten Weg führen 
MfG


----------



## Gast2 (15. Aug 2012)

> 1.Wenn man jetzt ein Objekt von Gui erzeugt, wird gleichzeitig noch eines von JFrame erzeugt...kann irgendwie nicht so richtig sein.


Was ist daran problematisch? Es werden bei einer GUI doch etliche Objekte erzeugt.



> 2. Wie setzte ich das jetzt in der Main visible? So geht's wohl schlehct, weil Gui setVisible() nicht kennt(Stichwort extends)


Naja, wurd doch weiter oben schon gezeigt:


```
public class Gui {
  JFrame fenster = new JFrame();
    
  public Gui()
  {
    fenster.setTitle("Ohne extends JFrame :)");
    fenster.setSize(300,500);
    fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
  }

  public void setVisible(boolean visible)
  {
    fenster.setVisible(visible);  
  }
}
```


----------



## vanny (15. Aug 2012)

```
public class DasPanel extends JPanel{
	
	public DasPanel(){
		
		JButton btn = new JButton("Foo");
		this.add(btn);

	}
	
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new DasPanel());
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

}
```

DasPanel ist jetzt mal symbolisch für deine GuiComponenten.
Den JFrame erzeugst du komplett in der main und gut is.


----------



## JavaMeetsBlueJ (15. Aug 2012)

Jetzt kann man wieder beängeln, dass da das böse 
	
	
	
	





```
extends
```
 steht und die ganzen Aktionen in der Main ausgeführt werden. Ist halt ein heißes Thema hehe.

MfG


----------



## vanny (15. Aug 2012)

JavaMeetsBlueJ hat gesagt.:


> Jetzt kann man wieder beängeln, dass da das böse
> 
> 
> 
> ...



Kann man nicht bemängeln. Ist erstens nur ein Beispiel und sobald du in dem JPanel die paintComponent(); überschreibst, wird mehr getan als es einfach nur zu benutzen. Es wird spezialisiert und dann macht auch die Vererbung Sinn.
An einem JFrame lässt sich i.d.R. nicht viel spezialisieren, darum ist die Vererbung dort meisst unangebracht.


----------



## JavaMeetsBlueJ (16. Aug 2012)

Ok da muss ich mich leider geschlagen geben. Die  ganzen Beiträge haben mir aber schonmal weitergeholfen einiges in Zukunft naders zu machen. Dieses Thema wird meiner Auffassung nach so heiß diskutiert wie kein anderes und das ist ja auch OK so, solange jeder den anderen in vernünftiger Weise von seiner Sichtweise unterrichtet, wie es hier passiert ist. Fred ist jetzt dicht.
MfG


----------



## JavaMeetsBlueJ (24. Aug 2012)

Ich habe den Thraed nochmal als "offen" markiert, wiel mich das Thema einfach nicht loslässt. Folngender Code sollte den größten Teil zufriedenstellen. Tips sind wie immer gerne gesehen.


```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class Kontaktformular {

	BorderLayout layout = new BorderLayout();
	GridLayout gridLayout = new GridLayout(3,2);
	JFrame frame = new JFrame();
	JButton speichern = new JButton("Speichern");
	
	JPanel bedienPanel = new JPanel();
	JPanel eingabePanel = new JPanel();
	JPanel mainPanel = new JPanel();
	
	JLabel name = new JLabel("Name: ");
	JLabel vorname = new JLabel("Vorname: ");
	JLabel adresse = new JLabel("Adresse: ");
	JLabel alter = new JLabel("Alter: ");
	JLabel telNummer = new JLabel("Telefonnummer: ");
	JLabel geschlecht = new JLabel("Geschlecht: ");
	
	JLabel status = new JLabel();
	
	JTextField edtname = new JTextField("Mustermann");
	JTextField edtvorname = new JTextField("Max");
	JTextField edtadresse = new JTextField("Musterweg 58");
	JTextField edtalter = new JTextField("100");
	JTextField edttelNummer = new JTextField("069 / 123456789");
	JTextField edtgeschlecht = new JTextField("männlich");
	
	public Kontaktformular()
	{
		frame.add(mainPanel);
		mainPanel.setLayout(layout);
		mainPanel.add(bedienPanel, BorderLayout.SOUTH);
		mainPanel.add(eingabePanel, BorderLayout.CENTER);
		
		bedienPanel.setLayout(new BorderLayout());
		bedienPanel.add(speichern, BorderLayout.EAST);
		bedienPanel.add(status, BorderLayout.CENTER);
		
		speichern.addActionListener(
				
				new ActionListener(){

					@Override
					public void actionPerformed(ActionEvent e) {
						speichern();
						
					}
			
		

				}
				
			);
		
		eingabePanel.setLayout(gridLayout);
		eingabePanel.add(name);
		eingabePanel.add(edtname);
		eingabePanel.add(vorname);
		eingabePanel.add(edtvorname);
		eingabePanel.add(adresse);
		eingabePanel.add(edtadresse);
		eingabePanel.add(alter);
		eingabePanel.add(edtalter);
		eingabePanel.add(telNummer);
		eingabePanel.add(edttelNummer);
		
		
		frame.setTitle("Kontaktformular");
		frame.setSize(700,130);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
	}
	
	public void speichern()
	{
		status.setText("Ihre Kontaktdaten wurden erfolgreich gespeichert und an 1000 werbepartner übermittelt. Vielen Dank!");
	}
	
	public void setVisible(boolean isVisible)
	{
		frame.setVisible(isVisible);
	}
	
	
	public static void main(String[] args) {
		
Kontaktformular formular = new Kontaktformular();
formular.setVisible(true);
	}

}
```

MfG


----------



## pl4gu33 (25. Aug 2012)

ich würde .zb. die Label nicht als Klassen- Attribute deklarieren, wenn du sie nur an einer Stelle verwendest, kannst/solltest du sie auch in der Methode erzeugen/verwenden... (auf die anderen Komponenten, die man nur einmal verwendet oder in einem Block ebenfalls bezogen)


----------



## JavaMeetsBlueJ (25. Aug 2012)

Also beispielsweise so?:

```
private void initComponents()
{
 JLabel xy = new JLabel();
JButton buttonBla = new JButton();
.
.
.
usw.
}
```

oder ist es da villeicht noch besser bei der Methode einen Rückgabewert wie Component zurückzuliefern?
MfG

[EDIT]ISt es eigentlich schlecht, wenn man Komponenten, die öfters vorkommen wie hier das Textfeld in einem Arry speichert und die Komponenten hizufügt indem man durch das Array itteriert?[/EDIT]


----------



## pl4gu33 (26. Aug 2012)

jap so meint ich das ,... die Methode sollte eigentl. nix zurück liefern, da die Komponenten eh nur in der Methode gebraucht werden.... allgemein kannst du mehrere Textfelder etc. schon in Listen/Arrays speichern und dann mit diesen arbeiten


----------



## JavaMeetsBlueJ (26. Aug 2012)

Also mit Rückgabewerten hab ich das so mal gebastelt.

```
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;



public class ChatGui {

	private final JTextArea myText = new JTextArea(3,30);
	private final JTextArea otherText = new JTextArea();
	private ImageIcon myIcon = new ImageIcon("Penguins.jpg");
	
	
	private JPanel createotherTextPanel(){
		JPanel otherTextPanel = new JPanel(new BorderLayout());
		otherTextPanel.setBorder(BorderFactory.createTitledBorder("Nachrichtenverlauf"));
		JScrollPane scrollbar = new JScrollPane(otherText);
		otherText.setLineWrap(true);
		otherText.setEditable(false);
		otherTextPanel.add(scrollbar, BorderLayout.CENTER);
		return otherTextPanel;
	}
	
	private JPanel createmyTextPanel(){
		JPanel myTextPanel = new JPanel(new BorderLayout());
		myTextPanel.setBorder(BorderFactory.createTitledBorder("Nachricht"));
		JScrollPane scrollbar1 = new JScrollPane(myText);
		myTextPanel.add(scrollbar1,BorderLayout.CENTER);
		myText.setLineWrap(true);
		return myTextPanel;
	}
	
	private JPanel createsendButtonPanel(){
		JPanel sendButtonPanel = new JPanel(new BorderLayout());
		//sendButtonPanel.setBorder(BorderFactory.createTitledBorder("Senden"));
	    JButton senden = new JButton("Senden");
		sendButtonPanel.add(senden,BorderLayout.EAST);
		senden.addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent arg0) {
				System.out.println("Senden");
			}
			
		});
		return sendButtonPanel;
	}
	private JPanel createiconPanel()
	{
		JPanel iconPanel = new JPanel(new BorderLayout());
		JLabel iconLabel = new JLabel(new ImageIcon("Penguins.jpg")); // Wieso gibts hier eigentlich kein Bild im Frame?
		iconPanel.add(iconLabel,BorderLayout.NORTH);
		return iconPanel;
		
	}
	
	private JFrame createFrame(){
		JFrame frame = new JFrame();
		frame.add(createotherTextPanel(),BorderLayout.CENTER);
		frame.add(createmyTextPanel(),BorderLayout.NORTH);
		frame.add(createsendButtonPanel(),BorderLayout.SOUTH);
		frame.add(createiconPanel(),BorderLayout.EAST);
		frame.setSize(500,400);
		frame.setLocationRelativeTo(null);
		return frame;
	}
	

	public static void main(String[] args){
		
		ChatGui gui = new ChatGui();
		JFrame main = gui.createFrame();
		main.setVisible(true);
		main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}
```

MfG


----------

