Sauberer Gui-Code?

JavaMeetsBlueJ

Bekanntes Mitglied
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:'()

Java:
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

Top Contributor
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 :)
 
Zuletzt bearbeitet:

Evil-Devil

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

Zb.

Java:
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

Bekanntes Mitglied
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

Mitglied
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
 
V

vanny

Gast
... 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

Bekanntes Mitglied
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

Bekanntes Mitglied
[...]
-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:
Java:
//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

Mitglied
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.

Java:
public class GUI {
  private JFrame frame;
  
  [...]

  public void setVisible(boolean b) {
    frame.setVisible(b);
  }
}
Java:
[...]
GUI g = new GUI();
g.setVisible(true);
 
G

Gast2

Gast
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

Bekanntes Mitglied
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.

Java:
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)
Java:
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
 
G

Gast2

Gast
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:

Java:
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);  
  }
}
 
V

vanny

Gast
Java:
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.
 
Zuletzt bearbeitet von einem Moderator:

JavaMeetsBlueJ

Bekanntes Mitglied
Jetzt kann man wieder beängeln, dass da das böse
Java:
extends
steht und die ganzen Aktionen in der Main ausgeführt werden. Ist halt ein heißes Thema hehe.

MfG
 
V

vanny

Gast
Jetzt kann man wieder beängeln, dass da das böse
Java:
extends
steht und die ganzen Aktionen in der Main ausgeführt werden. Ist halt ein heißes Thema hehe.

MfG

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

Bekanntes Mitglied
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

Bekanntes Mitglied
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.

Java:
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

Top Contributor
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)
 
Zuletzt bearbeitet:

JavaMeetsBlueJ

Bekanntes Mitglied
Also beispielsweise so?:
Java:
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]
 
Zuletzt bearbeitet:

pl4gu33

Top Contributor
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

Bekanntes Mitglied
Also mit Rückgabewerten hab ich das so mal gebastelt.
Java:
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
comp_math Code snippets AWT, Swing, JavaFX & SWT 3
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Kann man den Code umschreiben? AWT, Swing, JavaFX & SWT 8
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S ActionEvent Press Enter per Code auslösen AWT, Swing, JavaFX & SWT 22
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T JavaFX Falscher Wert getLayoutBounds? + Tipps zum Code-Aufbau? AWT, Swing, JavaFX & SWT 8
S JavaFX JavaScript Code in WebView/WebEngine AWT, Swing, JavaFX & SWT 0
L JavaFX GUI mit JavaFX. Scene Builder source code? AWT, Swing, JavaFX & SWT 6
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Ernesto95 JavaFX FXML vs. Java Code AWT, Swing, JavaFX & SWT 3
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
T Tab per Code wechseln? AWT, Swing, JavaFX & SWT 3
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
N JOGL-Code != C OpenGL-Code? AWT, Swing, JavaFX & SWT 9
R Source-Code, Javadoc AWT, Swing, JavaFX & SWT 16
S NetBeans GUI Builder - Code-Platzierung AWT, Swing, JavaFX & SWT 3
B Color String Code AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
T Bei Klick Code ausführen AWT, Swing, JavaFX & SWT 17
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
A Applet Applet aus Code neu starten AWT, Swing, JavaFX & SWT 2
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
M JFileChooser setCurrentDirectory() - Verzeichnis relativ zum Code/binary AWT, Swing, JavaFX & SWT 14
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Warum funktioniert dieser Code ? (GUI) AWT, Swing, JavaFX & SWT 9
M ActionListener mit code!!! auslösen AWT, Swing, JavaFX & SWT 3
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
K Swing GUI code tutorials? AWT, Swing, JavaFX & SWT 5
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
G Code Blöcke AWT, Swing, JavaFX & SWT 6
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
O Source Code für "javax.swing.JLabel" ? AWT, Swing, JavaFX & SWT 2
T Öffnen von SWT-Dialogboxen durch HTML-Link in HTML-Code AWT, Swing, JavaFX & SWT 4
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
R Sun tutorial code von jcombobox mit image im combobox fehlt! AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Optik trotz gleicher Look and Feel Code? AWT, Swing, JavaFX & SWT 11
M Code umbauen ? AWT, Swing, JavaFX & SWT 7
C GUI passt sich nicht dem Code an! AWT, Swing, JavaFX & SWT 4
7 Latex/MathML Code in JTextPane AWT, Swing, JavaFX & SWT 2
B Code Architektur verbessern. AWT, Swing, JavaFX & SWT 4
R Syntax Highlighting von Java-Code AWT, Swing, JavaFX & SWT 2
O Swing Event / in GUI oder im Code ausgelöst ? AWT, Swing, JavaFX & SWT 2
J eventhandling / Problemmeldung Bitte schaut euch den Code an AWT, Swing, JavaFX & SWT 2
M Code Schloss AWT, Swing, JavaFX & SWT 11
C wysiwyg Editor zum Einbinden in meinem Code AWT, Swing, JavaFX & SWT 14
m@nu JComboBox & ItemListener: per Code 1. Item wählen AWT, Swing, JavaFX & SWT 2
M Mit JTextPane erstelltes Dokument als HTML-Code ausgeben AWT, Swing, JavaFX & SWT 4
H Code nach dem schließen eines Fensters ausführen? AWT, Swing, JavaFX & SWT 3
M Was halter iht von diesem Code? AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben