Swing SwingGUI - Erstellen für Anfänger

kneubi

Mitglied
Hallo zusammen

Da ich mein letztes Tool mit einem GUIBilder ber Drag'n'Drop zusammengeklickt habe und der Code ja absolut untragbar aussieht habe ich mich nun weiter mit Swingtutorials beschäftigt.

Dabei geht es nun aktuell um Grundlegende Funktionsfragen wie man es "besser" löst...

Folgendene Javacode habe ich mit drei verschiedenen Tutorials erstellt:

Java:
package ch.kneubi89.testswing;

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

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


public class testGUI extends JFrame implements ActionListener{
	
	private JButton quitButton;
	private JButton OKButton;
	
    public testGUI() {
    	initGUI();
     }

	
	public final void initGUI() {
		JPanel panel = new JPanel();
		getContentPane().add(panel);
		
		panel.setLayout(null);
		
		JButton quitButton = new JButton("Quit");
		this.quitButton = quitButton;
		quitButton.setBounds(10, 10, 80, 30);
		quitButton.addActionListener(this);
		
		JButton OKButton = new JButton("OK");
		this.OKButton = OKButton;
		OKButton.setBounds(10, 50, 80, 30);
		OKButton.addActionListener(this);
		
		JButton OK2Button = new JButton("OK2");
		OK2Button.setBounds(10, 90, 80, 30);
		OK2Button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				JOptionPane.showMessageDialog(null, "test2");
			}
		});
		
		panel.add(quitButton);
		panel.add(OKButton);
		panel.add(OK2Button);
		
		setTitle("Sample GUI");
		setSize(500,500);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
	}


	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				testGUI inst = new testGUI();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);				
			}
		});
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() == quitButton){
			this.dispose();
		}
		if(e.getSource() == OKButton){
			JOptionPane.showMessageDialog(null, "test");
		}
	}
}

1. Frage
Zum einen lese ich immer wieder dass "extends JFrame" eine mögliche Lösung sei, aber dies sei unsauber wenn man keine Überschreibungen macht. -> Sind hier von Methodenüberschreibungen der Klasse JFrame gemeint und warum ist dies unsauber?

Was ich leider nicht ganz kapiere, wie muss ich es denn machen ohne "extends JFrame"?

2. Frage
Ich habe hier zwei verschiedene Möglichkeiten gebaut ActionListener an die Componenten hinzuzufügen. Welcher Weg ist der "bessere/saubere"? Ich finde den beim "OK2Button" komplizierter / unübersichtlicher. Allerdings finde ich die Art unschön dass ich beim "OKButton" das Objekt in eine Variabel schreiben muss und dem panel zuordnen. Ansonsten kann ich keine "if-Abfrage auf den Button" machen. Muss der ActionListener immer per "Implements" der Klasse angehängt werden oder ist dies auch "unsauber" und man sollte es anders lösen?

3. Frage
Es gibt X verschiedene Layouts, Border, Flow, Grid, Group usw. Wenn man sich selber ein GUI mit meinem GUIBuilder zusammenklick es es am einfachsten im "Grouplayout" allerdings generiert das sehr sehr viel Code. Das Borderlayout hat mehrere Constanten, doch die müssen nicht zwingend verwendet werden(North,South, Center, West, East)? Verwendet ihr je nach Situation die Layouts oder kann ich sagen "ich mache alles mit dem Borderlayout und setze die Komponenten per "setBounds(int, int, int, int) an meine gewünschte stelle. Die Frage könnte man zusammenfassen als "Wie handel ich das am besten mit den Layouts?".

4. Frage -> OffTopic
Die ganzen Fragen tauchen auf weil mein erstes Programm praktisch jede Klasse über 1000 Codezeilen hat und mir Leute immer wieder sagen, dass 1000 Zeilen Code in einer Klasse ist nicht ideal und eher schlecht Programmiert sei. Da ich das Ziel habe später von Systemtechniker auf Javaprogrammierung im Beruf umzusteigen muss ich mir jetzt beim lernen eine "saubere" Programmierung anzugewöhnen. Gibt es insgesamt irgendwo eine art "Javaprogramming-Regelwerk" wo es ein paar Regeln gibt wie man den Code schreiben sollte?

Mein Programm funktioniert, aber eben, jemand der schon länger Javaprogrammiert hätte vermutlich nur die hälfte meines Codes schreiben müssen.

Gruss
Kneubi
 

Marco13

Top Contributor
1. Frage
http://www.java-forum.org/blogs/firephoenix/182-leidige-extends-jframe.html

2. Frage
Spätestens wenn man 10 Buttons (oder andere Components) hat, und die Hauptklasse dann
implements ItemListener, ActionListener, ChangeListener, SackOfRiceFellInChinaListener
implementiert, und in jeder Methode mit
Java:
if (event.getSource() == foo) doFoo();
else if (event.getSource() == bar) doBar();
...
geschaut werden muss, wo der Event eigentlich herkam, wird das Schrecklich unübersichtlich. BTW: Für Buttons usw. gibt es auch noch How to Use Actions (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features) als Alternative.

3. Frage
Die Frage könnte man zusammenfassen als "Wie handel ich das am besten mit den Layouts?".
Da gibt es verschiedene Freiheitsgrade. Aber 'setBounds' fällt bei LayoutManagern komplett weg. Hatte mal in http://www.java-forum.org/allgemeine-java-themen/85459-layout-auslagern-genau.html#post534980 ein bißchen was ("unverbindliches", wirklich nur ganz grob-sinngemäßes) geschrieben.



4. Frage -> OffTopic
Die ganzen Fragen tauchen auf weil mein erstes Programm praktisch jede Klasse über 1000 Codezeilen hat und mir Leute immer wieder sagen, dass 1000 Zeilen Code in einer Klasse ist nicht ideal und eher schlecht Programmiert sei.

Speziell GUI-Klassen können schon schnell recht groß werden, bis man alle Fonts, Spacings, Borders, Colors, Listener und Untercomponents untergebracht hat. Wenn man die Struktur einigermaßen aufgeräumt hält (GROB wie in dem Thread zum Layout oben) ist das noch OK, d.h. diese "Grenze" von 1000 Zeilen (die keine ist ;)) gilt IMHO weniger für GUI-Klassen. BTW: Die Klasse 'JTable' hat schlappe ~10000 Zeilen - aber man muss es ja nicht übertreiben ;)
 

Michael...

Top Contributor
Java:
		JButton quitButton = new JButton("Quit");
		this.quitButton = quitButton;
So etwas ist unnötig und kann auch mal schief gehen. Wozu Du zweite lokale Variable? Einfach:
Code:
this.quitButton = new JButton("Quit");
1. Frage
Zum einen lese ich immer wieder dass "extends JFrame" eine mögliche Lösung sei, aber dies sei unsauber wenn man keine Überschreibungen macht. -> Sind hier von Methodenüberschreibungen der Klasse JFrame gemeint und warum ist dies unsauber?

Was ich leider nicht ganz kapiere, wie muss ich es denn machen ohne "extends JFrame"?
Das gilt grundsätzlich: Nur soviel Vererbung wie nötig. Klassen nur erweitern wenn man auch deren Funktion erweitert/anpasst. In dem Fall verwendest Du nur ein JFrame Objekt, also einfach eine Objekt erstellen
Code:
JFrame frame = new JFrame();
und das in Deinem Code / Konstrutor verwenden.
2. Frage
Ich habe hier zwei verschiedene Möglichkeiten gebaut ActionListener an die Componenten hinzuzufügen. Welcher Weg ist der "bessere/saubere"? Ich finde den beim "OK2Button" komplizierter / unübersichtlicher. Allerdings finde ich die Art unschön dass ich beim "OKButton" das Objekt in eine Variabel schreiben muss und dem panel zuordnen. Ansonsten kann ich keine "if-Abfrage auf den Button" machen. Muss der ActionListener immer per "Implements" der Klasse angehängt werden oder ist dies auch "unsauber" und man sollte es anders lösen?
Da gibt es kein sauber/besser. Beide Lösungen haben Ihre Berechtigungen und es kommt immer auf Kontext und Zweck an. Das aber Deine Hauptklasse ActionListener implementiert finde ich eher unschön und wird man bei größeren Projekten nicht unbedingt machen. Bei der Lösung "OK2Button" spricht man übrigens von einer anonymen inneren Klasse. Eine Variable mit Referenz auf den Button braucht man in allen Fällen, um ihn der GUI zu zuweisen.
3. Frage
Es gibt X verschiedene Layouts, Border, Flow, Grid, Group usw. Wenn man sich selber ein GUI mit meinem GUIBuilder zusammenklick es es am einfachsten im "Grouplayout" allerdings generiert das sehr sehr viel Code. Das Borderlayout hat mehrere Constanten, doch die müssen nicht zwingend verwendet werden(North,South, Center, West, East)? Verwendet ihr je nach Situation die Layouts oder kann ich sagen "ich mache alles mit dem Borderlayout und setze die Komponenten per "setBounds(int, int, int, int) an meine gewünschte stelle. Die Frage könnte man zusammenfassen als "Wie handel ich das am besten mit den Layouts?".
Die verschiedenen LayoutManager sind für verschiedene Situationen/Anforderungen. Mit der Zeit entwickelt man ein Gefühl wann welches Layout geschickter ist. Allgemein kann man unterschiedliche Layouts ineinander verschachteln. Es gibt wohl kaum eine GUI, die nur ein einziges Layout verwendet - ausser sie ist mit einem Builder zusammengeklickt.
oder kann ich sagen "ich mache alles mit dem Borderlayout und setze die Komponenten per "setBounds(int, int, int, int) an meine gewünschte stelle.
Ein BorderLayout bzw. LayoutManager generell ignorieren solche
Code:
setBounds...
und platzieren die Komponenten entsprechend der implementierten Regeln. In Deinem Fall verwendest Du das "null" Layout - also keinen LayoutManager, was in den meisten Fällen die schlechteste Lösung ist.
4. Frage -> OffTopic
Die ganzen Fragen tauchen auf weil mein erstes Programm praktisch jede Klasse über 1000 Codezeilen hat und mir Leute immer wieder sagen, dass 1000 Zeilen Code in einer Klasse ist nicht ideal und eher schlecht Programmiert sei. Da ich das Ziel habe später von Systemtechniker auf Javaprogrammierung im Beruf umzusteigen muss ich mir jetzt beim lernen eine "saubere" Programmierung anzugewöhnen. Gibt es insgesamt irgendwo eine art "Javaprogramming-Regelwerk" wo es ein paar Regeln gibt wie man den Code schreiben sollte?
Allgemein gibt es die Code Conventions Code Conventions for the Java Programming Language und daneben sicherlich noch unzählige Bücher, die sich damit beschäftigen. 1000 Codezeilen sind ein Indiz dafür, dass im Klassendesign noch Potential stecken könnte - sind aber manchmal durchaus vertretbar. In den Standardklassen gibt es durchaus Klassen mit weit mehr als 1000 Zeilen.
Allerdings neigen Anfänger aber dazu viel zu viel in eine Klasse zu packen.
 

kneubi

Mitglied
Danke für die Ausführlichen antworten.

Danke für das aufmerksam machen auf diesen Fall. Ich hatte am anfang Probleme dass ich immer die instanzierten Objekte nicht referenziert habe. Daher unterlaufen mir nun ab und an solche doppelfehler. Nach 1-2 Stunden merke ich das dann plötzlich.

Ja, das trennen in Klassen muss ich noch etwas besser im gespür haben... ich arbeite ab und an auf der Arbeit mit VBA, ist für mich eine ziemliche Umstellung für Java. Ich bin mir auch nicht so ganz sicher wann ich denn eine neue Klasse erstellen muss. Es ist klar, für jedes "Objekt" das ich instanzieren muss wäre eine Klasse von vorteil, vorallem wenn es ein eigenes erstelltes Objekt ist. Aber bei meinem Hauptgui habe ich bestimmt noch zig möglichkeiten Sinnvolle Klassen zu erstellen.

Am Wochenende habe ich noch etwas Zeit und werde mir dies nochmal durch den Kopfgehen lassen und vielleicht noch die ein oder andere Frage stellen.

Gruss
Kneubi
 

kneubi

Mitglied
Da gibt es kein sauber/besser. Beide Lösungen haben Ihre Berechtigungen und es kommt immer auf Kontext und Zweck an. Das aber Deine Hauptklasse ActionListener implementiert finde ich eher unschön und wird man bei größeren Projekten nicht unbedingt machen. Bei der Lösung "OK2Button" spricht man übrigens von einer anonymen inneren Klasse. Eine Variable mit Referenz auf den Button braucht man in allen Fällen, um ihn der GUI zu zuweisen.
Wenn ich es richtig verstehe ist die Lösung mit dem "OKButton" verwende muss ich den ActionListener nicht in der Klasse implementieren? Bei der Lösung von "OK2Button" schon?


Die verschiedenen LayoutManager sind für verschiedene Situationen/Anforderungen. Mit der Zeit entwickelt man ein Gefühl wann welches Layout geschickter ist. Allgemein kann man unterschiedliche Layouts ineinander verschachteln. Es gibt wohl kaum eine GUI, die nur ein einziges Layout verwendet - ausser sie ist mit einem Builder zusammengeklickt.
Da ich unerfahren bin was LayoutManagern angeht... ich habe dem Beitrag hier eine Abbildung von meinem GUI angehängt. Mit ein paar Überlegungen wo welches Layouts. Wie ich das sehe muss ich ein Panel rein und diesem Panel weise ich dann das Layout zu und lege dann die Komponenten in dieses Panel. Allerdings bin ich mir unsicher wann welches Layout ideal ist.. haben mir hier erfahrenere Programmierer ein paar Tipps?
Mir stellt sich vorallem die frage.. dem "Grundpanel" wo alles andere beinhaltet, welches Layout vergebe ich dem? Wenn ich es so sehe habe ich 3 Bereiche, wegen dem Mittleren kann ich aber das BorderLayout nicht verwenden...

Das GUI ist so entstanden weil ich es mit einem GUI-Builder zusammengeklickt habe... es war mir am anfang zu kompliziert in die GUI-Programmierung direkt einzusteigen... lieber erst etwas die Klassen, Methoden usw. einarbeiten. bzw. die Objektorientierteprogrammierung kennenlernen. Nun verhält sich das GUI aber total schräg(auf Mac sieht es anders aus als auf Windows usw..) und wenn ich irgendwo eine GUI-Anpassung auch nur ein Button einfügen will verhaut es mir da komplette gui... -> ich nehme an dies ist wegen der mieserablen GUIqualität und weil ich es mit einem GUI-Builder zusammengeklickt habe. Daher versuche ich es nun sauber aufzubauen.


Eine weitere Frage zu GUI-Programmierung ohne "extends JFrame".

Ich versuche gerade ein GUI zu bauen ohne "extends JFrame". Allerdings klappt es nicht so ganz.

Folgenden Code habe ich in der Klasse:

Java:
	public final void initGUI() {
		JPanel basisPanel = new JPanel();
		basisPanel.setLayout(null);
		
		
		basisPanel.setSize(500,500);
	}
    
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame basisFrame = new JFrame();
				basisFrame.setLocationRelativeTo(null);
				basisFrame.setVisible(true);				
			}
		});
	}

Wie kriege ich das Panel in das JFrame rein? Bei meinem "extends JFrame" Beispiel habe ich folgende Zeile im Code:

Java:
getContentPane().add(panel);

Diese habe ich aber nicht zur verfügung wenn ich kein "extends JFrame" mache. Muss ich mein basisFrame in eine Variabel schreiben die überall in der Klasse sichtbar ist anstatt nur in der Methode "main"? Ich stehe irgendwie gerade auf dem Schlauch...

Okay.. habe die GUI inizialisierung hingekriegt...

Java:
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new MainGUI();			
			}
		});
	}
	
	public MainGUI(){
		JFrame basisFrame = new JFrame();
		basisFrame.setSize(500, 500);
		basisFrame.setLocationRelativeTo(null);
		basisFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		JPanel basisPanel = new JPanel();
		basisPanel.setSize(500,500);
		basisPanel.setLayout(null);
		
		basisFrame.add(basisPanel);

		basisFrame.setVisible(true);
	}

Der rest ist nachwievor offen... Bin per zufall auf einen Forumbeitrag hier gestossen der mir die Augen geöffnet hat :)
 

Anhänge

  • gui.jpg
    gui.jpg
    139,8 KB · Aufrufe: 49

Marco13

Top Contributor
Das Muster ist eigentlich immer das gleiche
Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = null; // Create your main panel here...
        
        frame.getContentPane().add(panel);
        frame.pack(); // or frame.setSize(600,600)
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Der Rest... das war die Frage nach "Best Practices für's Layout" oder...?
 

Michael...

Top Contributor
Wenn ich es richtig verstehe ist die Lösung mit dem "OKButton" verwende muss ich den ActionListener nicht in der Klasse implementieren? Bei der Lösung von "OK2Button" schon?
Ja, bei der ersten Variante hast du wie bei jedem anderen Methodenaufruf, die Freiheit die Klasse intern, extern oder sonst wie zu definieren.
Der "Clou" bei der zweiten Variante ist, das die Klasse intern und anonym ist und somit keine Spuren andere Stelle im Code oder sonstwo auftauchen.
Mir stellt sich vorallem die frage.. dem "Grundpanel" wo alles andere beinhaltet, welches Layout vergebe ich dem? Wenn ich es so sehe habe ich 3 Bereiche, wegen dem Mittleren kann ich aber das BorderLayout nicht verwenden...
Das ist so schwer zu sagen, evtl. wäre das GridBagLayout ja eine Möglichkeit. Letztendlich hängt es davon ab, nach welchen Kriterien sich die Komponenten wie auf dem Layout verteilen dürfen/sollen.
 

kneubi

Mitglied
Das ist so schwer zu sagen, evtl. wäre das GridBagLayout ja eine Möglichkeit. Letztendlich hängt es davon ab, nach welchen Kriterien sich die Komponenten wie auf dem Layout verteilen dürfen/sollen.


Ich bin gerade dabei etwas herumzuspielen.

Die LayoutManager sind für mich mehr ein Fluch als sonstwas... liegt aber wohl eher daran dass ich mir nicht gewohnt bin damit zu arbeiten... Ich bin mit GridLayout, FlowLayout und BoxLayout am herumspielen. Allerdings ist keines davon für mich wirklich zu gebrauchen da es setPreferedSize bzw. setSize ignoriert...

Ich habe auf meinem GUI drei Panel, jedes Panel hat eine "eigene höhe" und nicht alle die gleiche...

GridBagLayout habe ich mir auch angeschaut, aber das sieht für mich extrem kompliziert aus...ich muss ja anscheinend pro Objekt 3 Werte definieren.. sieht mir nach extrem viel mehr schreibarbeit aus als bei den anderen und für mich irgendwie unübersichtlicher als das "setBounds()" bei jedem Objekt... Dennoch setze ich mich einmal daran.

Ich versuche es damit zu entschlüsseln:
How to Use GridBagLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

Ich versteh aber leider nicht ganz alles was in ihrem Beispielcode gemacht wird bzw. was was genau macht. Hast du vielleicht eine "anfänger Seite" zum GridBagLayout?
 

turtle

Top Contributor
Ich rate dir den, meiner Meinung nach besten, Layout-Manager, nämlich JGoodies FormLayout anzuschauen.

Diesen benutze ich ausschließlich für ALLE meine Swing-GUIs. Wird unter anderem unterstützt vom WindowBuilder in Eclipse.
 

kneubi

Mitglied
Vielen Dank Turtle, werde ich mir auf jedenfall anschauen.

Nun habe ich aber noch eine Frage zum ActionListener den ich eingebaut habe.



Michael... hat gesagt.:
kneubi hat gesagt.:
2. Frage
Ich habe hier zwei verschiedene Möglichkeiten gebaut ActionListener an die Componenten hinzuzufügen. Welcher Weg ist der "bessere/saubere"? Ich finde den beim "OK2Button" komplizierter / unübersichtlicher. Allerdings finde ich die Art unschön dass ich beim "OKButton" das Objekt in eine Variabel schreiben muss und dem panel zuordnen. Ansonsten kann ich keine "if-Abfrage auf den Button" machen. Muss der ActionListener immer per "Implements" der Klasse angehängt werden oder ist dies auch "unsauber" und man sollte es anders lösen?


Da gibt es kein sauber/besser. Beide Lösungen haben Ihre Berechtigungen und es kommt immer auf Kontext und Zweck an. Das aber Deine Hauptklasse ActionListener implementiert finde ich eher unschön und wird man bei größeren Projekten nicht unbedingt machen. Bei der Lösung "OK2Button" spricht man übrigens von einer anonymen inneren Klasse. Eine Variable mit Referenz auf den Button braucht man in allen Fällen, um ihn der GUI zu zuweisen.

Ich versuche aktuell das "implements ActionListener" rauszukriegen...

Ich möchte nach Möglichkeit aber auch nicht jedem Button einen neuen ActionListener hinzufügen sondern einen definieren und für alle buttons verwenden. Mein "neues GUI" habe ich inzwischen auch gebaut. Da ich nicht die Anforderung habe dass man das GUI "grösser und kleiner" gemacht werden soll sondern einfach die Defaultgrösse benutzt habe ich teilweise etwas "setBounds" und ohne LayoutManager gebaut... ich habs einfach nicht so hingekriegt wie ich wollte....

So schaut der Code aus:

Java:
package newGUI.copy;


import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.peer.PanelPeer;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;

import ch.kneubi89.lornv.daten.Army;
import ch.kneubi89.lornv.daten.MyField;
import ch.kneubi89.lornv.daten.MyTableModel;
import ch.kneubi89.lornv.daten.Player;
import ch.kneubi89.testswing.testGUI;


public class MainGUItest {
	
	{ //Set Look & Feel
		try {
			javax.swing.UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

    private Integer intSelectedPlayer;
    private Integer intSelectedArmy;
	private ArrayList<Player> alPlayer = new ArrayList<Player>();
    private Integer intRound = 1;
    private String MySavePath;
    private Player Player;
    private Army Army;
    private MyField Field;

		
	private JTextField jtxtPlayerAdd = new JTextField();
	private JComboBox<Object> jcbPlayer = new JComboBox<Object>();
	private JTextField jtxtArmyAdd = new JTextField();
	private JComboBox<Object> jcbPlayerArmyList = new JComboBox<Object>(); 
	private JButton jcmdPlayerAdd = new JButton("Add Player");
	private JButton jcmdPlayerRemove = new JButton("Remove Player");
	private JButton jcmdArmyAdd = new JButton("Add Army");
	private JButton jcmdArmyRemove = new JButton("Remove Army");
	private JButton jcmdNextRound = new JButton("Next Round");
	private JLabel jlblRoundName = new JLabel("Round:");
	private JLabel jlblRoundNumber = new JLabel("1");
	private JButton jcmdModPlayerPoints = new JButton("Modify Points");
	private JButton jcmdUnitAdd = new JButton("Add Unit");
	private JButton jcmdArmyMerge = new JButton("Merge Army with");
	private JButton jcmdPrintPlayer = new JButton("Print");
	private JButton jcmdSave = new JButton("Save");
	private JButton jcmdLoad = new JButton("Load");
	private JComboBox jcbPlayerArmyList2 = new JComboBox();
	private JCheckBox jchbFlying = new JCheckBox("Flying");
	private JCheckBox jchbMechanized = new JCheckBox("Mechanized");
	private JCheckBox jchbTired = new JCheckBox("Tired");
	private JCheckBox jchbFortified = new JCheckBox("Fortified");
	private JCheckBox jchbVigliant = new JCheckBox("Vigliant");
	private JCheckBox jchbAntiScouting = new JCheckBox("Anti scouting");
	private JCheckBox jchbUnderArtilleryFire = new JCheckBox("Under artillery fire");
	private JCheckBox jchbWithoutHQ = new JCheckBox("Without HQ");
    private JScrollPane jspArmyView = new JScrollPane();
    private JTable jtblArmyView = new JTable();
    private ArrayList<MyTableModel> alMainGUITableModel = new ArrayList<MyTableModel>();
    private MyTableModel MainGUITableModel = new MyTableModel();
	private JLabel jlblPlayerFields = new JLabel("Playerfields:");
    private JScrollPane jspViewPlayerFields = new JScrollPane();
    private	DefaultListModel<MyField> jltPlayerFieldsModel = new DefaultListModel<MyField>();
    private ArrayList<DefaultListModel> alPlayerFieldsModel = new ArrayList<DefaultListModel>();
    private JList<MyField> jltPlayerFields = new JList<MyField>();
    private JComboBox jcbFields = new JComboBox();
    private JLabel jlblPositionField = new JLabel("Position:");
    private JTextField jtxtFieldPosition = new JTextField();
    private JButton jcmdAddFieldtoPlayer = new JButton("Add Field");
    private JButton jcmdRemoveField = new JButton("Remove Field");
    private JLabel jlblIAP = new JLabel("IAP:");
    private JLabel jlblIAPPoints = new JLabel("0");
    private JLabel jlblTAP = new JLabel("TAP:");
    private JLabel jlblTAPPoints = new JLabel("0");
    private JLabel jlblKP = new JLabel("KP:");
    private JLabel jlblKPPoints = new JLabel("0");
    private JLabel jlblSP = new JLabel("SP:");
    private JLabel jlblSPPoints = new JLabel("0");
    private JLabel jlblSTP = new JLabel("STP:");
    private JLabel jlblSTPPoints = new JLabel("0");
    private JButton jcmdClose = new JButton("Close");
    
    
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new MainGUItest();			
			}
		});
	}
	
	public MainGUItest(){
		
		ActionListener actlGUI = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == jcmdPlayerAdd) {
					addPlayer();
				}if (e.getSource() == jcmdPlayerRemove) {
					removePlayer();
				}if (e.getSource() == jcmdArmyAdd) {
					addArmy();
				}if(e.getSource() == jcmdArmyRemove){
					removeArmy();
				}if (e.getSource() == jcmdArmyMerge) {
					mergeArmy();
				} if (e.getSource() == jcmdUnitAdd){
					addUnit();
				} if (e.getSource() == jcbPlayer) {
					changeJcbPlayer();
				} if (e.getSource() == jcbPlayerArmyList) {
					changeJcbPlayerArmyList();
				}if (e.getSource() == jchbFlying) {
					changeFlying();
				}if (e.getSource() == jchbMechanized) {
					changeMechanized();
				}if (e.getSource() == jchbTired) {
					changeTired();
				}if (e.getSource() == jchbFortified) {
					changeFortified();
				}if (e.getSource() == jchbVigliant) {
					changeVigliant();
				}if (e.getSource() == jchbAntiScouting) {
					changeAntiScounting();
				}if (e.getSource() == jchbUnderArtilleryFire) {
					changeUnderArtilleryFire();
				}if (e.getSource() == jchbWithoutHQ) {
					changeWithoutHQ();
				}if (e.getSource() == jcmdNextRound){
					nextRound();
				}if(e.getSource() == jcmdModPlayerPoints){
					modifyPlayerPoints();
				}if(e.getSource() == jcmdAddFieldtoPlayer){
					addField();
				}if(e.getSource() == jcmdRemoveField){
					removeField();
				}if(e.getSource() == jcmdClose){
					closeMainGUI();
				}if(e.getSource() == jcmdSave){
					loadData();
				}if(e.getSource() == jcmdLoad){
					saveData();
				}if(e.getSource() == jcmdPrintPlayer){
					printAllPlayerInfo();
				}
			}
		};
		Border border = new EmptyBorder(0, 7, 0, 0);
		FlowLayout myFlowLayoutLeading = new FlowLayout(FlowLayout.LEADING);
		GridLayout myGridLayout_4Z_2S = new GridLayout(4, 2, 5, 5);
		Dimension dimensionPointPanel = new Dimension(200,20);
		Dimension dimensionPointLabel = new Dimension(40,15);
		Dimension dimensionPointValue = new Dimension(100,15);
		
		JFrame basisFrame = new JFrame();
		basisFrame.setSize(1010, 610);
		basisFrame.setLocationRelativeTo(null);
		basisFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		JPanel basisPanel = new JPanel();
		basisPanel.setSize(1010,610);
		basisPanel.setLayout(null);
		
		
			JPanel panelTop = new JPanel();
			panelTop.setBounds(0, 0, 993,133);
			panelTop.setLayout(null);
			
				JPanel panelTopLeft = new JPanel();
				panelTopLeft.setBounds(5, 5, 330, 128);
				panelTopLeft.setLayout(myGridLayout_4Z_2S);
				jcbPlayer.addActionListener(actlGUI);
				
				
				JPanel panelTopMiddle = new JPanel();
				panelTopMiddle.setBounds(338, 5, 330, 128);
				panelTopMiddle.setLayout(myGridLayout_4Z_2S);
				
				JPanel panelRound = new JPanel();
				panelRound.setLayout(myFlowLayoutLeading);
				panelRound.setBorder(border);
				jlblRoundNumber.setPreferredSize(new Dimension(60, 15));
				
				JLabel jlblSpace1 = new JLabel();
				JLabel jlblSpace2 = new JLabel();
				JLabel jlblSpace3 = new JLabel();
				
				JPanel panelTopRight = new JPanel();
				panelTopRight.setBounds(672, 5, 320, 95);
				panelTopRight.setLayout(new GridLayout(3,3,5,5));
				
				JLabel jlblSpace4 = new JLabel();
				JLabel jlblSpace5 = new JLabel();
				JLabel jlblSpace6 = new JLabel();
				JLabel jlblSpace7 = new JLabel();
				JLabel jlblSpace8 = new JLabel();
				JLabel jlblSpace9 = new JLabel();
				
				JPanel panelTopRightBottom = new JPanel();
				panelTopRightBottom.setBounds(672,95,320,38);
				panelTopRightBottom.setLayout(null);
				jcbPlayerArmyList2.setBounds(0, 9, 180, 28);
				
			
			JPanel panelMiddle = new JPanel();
			panelMiddle.setBounds(0, 133, 993, 202);
			panelMiddle.setLayout(null);
			
				JPanel panelMiddleLeft = new JPanel();
				panelMiddleLeft.setBounds(5, 4, 165, 200);
				panelMiddleLeft.setLayout(new BoxLayout(panelMiddleLeft, BoxLayout.PAGE_AXIS));
				
					jspArmyView.setBounds(172, 4, 818, 195);
					jspArmyView.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
					jspArmyView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
					alMainGUITableModel.add(MainGUITableModel);
					jspArmyView.setViewportView(jtblArmyView);
					jtblArmyView.setModel(MainGUITableModel);
					jtblArmyView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
					jtblArmyView.getColumn("Slot").setPreferredWidth(60);
					jtblArmyView.getColumn("Count").setPreferredWidth(50);
					jtblArmyView.getColumn("Unitname").setPreferredWidth(400);
					jtblArmyView.getColumn("Points").setPreferredWidth(80);
					jtblArmyView.getColumn("Flying").setPreferredWidth(50);
					jtblArmyView.getColumn("Mechanized").setPreferredWidth(80);
					jtblArmyView.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			
			
			JPanel panelBottom = new JPanel();
			panelBottom.setBounds(0, 336, 993, 236);
			panelBottom.setLayout(null);
			
				JPanel panelBottomLeft = new JPanel();
				panelBottomLeft.setBounds(5, 4, 236, 232);
				panelBottomLeft.setLayout(null);
				
					jlblPlayerFields.setBounds(0, 0, 183, 20);
					jspViewPlayerFields.setBounds(0, 22, 236, 205);
					jspViewPlayerFields.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
					jspViewPlayerFields.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
					alPlayerFieldsModel.add(jltPlayerFieldsModel);
					jspViewPlayerFields.setViewportView(jltPlayerFields);
					jltPlayerFields.setModel(jltPlayerFieldsModel);
					jltPlayerFields.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			
				JPanel panelBottomMiddle = new JPanel();
				panelBottomMiddle.setBounds(246, 25, 170, 130);
				panelBottomMiddle.setLayout(new GridLayout(4,1,5,5));
				JPanel panelFieldPosition = new JPanel();
				panelFieldPosition.setLayout(myFlowLayoutLeading);
				jtxtFieldPosition.setPreferredSize(new Dimension(110, 20));
				
				JPanel panelBottomRight = new JPanel();
				panelBottomRight.setBounds(421, 4, 570, 232);
				panelBottomRight.setLayout(null);
				
					JPanel panelPlayerPoints = new JPanel();
					panelPlayerPoints.setBounds(0, 10, 200, 200);
					panelPlayerPoints.setLayout(myFlowLayoutLeading);
						JPanel panelIAP = new JPanel();
						panelIAP.setLayout(myFlowLayoutLeading);
						panelIAP.setPreferredSize(dimensionPointPanel);
						jlblIAP.setPreferredSize(dimensionPointLabel);
						jlblIAPPoints.setPreferredSize(dimensionPointValue);
						JPanel panelTAP = new JPanel();
						panelTAP.setLayout(myFlowLayoutLeading);
						panelTAP.setPreferredSize(dimensionPointPanel);
						jlblTAP.setPreferredSize(dimensionPointLabel);
						jlblTAPPoints.setPreferredSize(dimensionPointValue);
						JPanel panelKP = new JPanel();
						panelKP.setLayout(myFlowLayoutLeading);
						panelKP.setPreferredSize(dimensionPointPanel);
						jlblKP.setPreferredSize(dimensionPointLabel);
						jlblKPPoints.setPreferredSize(dimensionPointValue);
						JPanel panelSP = new JPanel();
						panelSP.setLayout(myFlowLayoutLeading);
						panelSP.setPreferredSize(dimensionPointPanel);
						jlblSP.setPreferredSize(dimensionPointLabel);
						jlblSPPoints.setPreferredSize(dimensionPointValue);
						JPanel panelSTP = new JPanel();
						panelSTP.setLayout(myFlowLayoutLeading);
						panelSTP.setPreferredSize(dimensionPointPanel);
						jlblSTP.setPreferredSize(dimensionPointLabel);
						jlblSTPPoints.setPreferredSize(dimensionPointValue);
			
				
				jcmdClose.setBounds(400, 200, 170, 28);

		basisFrame.add(basisPanel);
			basisPanel.add(panelTop);
				panelTop.add(panelTopLeft);
					panelTopLeft.add(jtxtPlayerAdd);
					panelTopLeft.add(jcmdPlayerAdd);
					panelTopLeft.add(jcbPlayer);
					panelTopLeft.add(jcmdPlayerRemove);
					panelTopLeft.add(jtxtArmyAdd);
					panelTopLeft.add(jcmdArmyAdd);
					panelTopLeft.add(jcbPlayerArmyList);
					panelTopLeft.add(jcmdArmyRemove);
					
					panelTop.add(panelTopMiddle);
					panelTopMiddle.add(jcmdNextRound);
					panelTopMiddle.add(panelRound);
						panelRound.add(jlblRoundName);
						panelRound.add(jlblRoundNumber);
					panelTopMiddle.add(jlblSpace1);
					panelTopMiddle.add(jlblSpace2);
					panelTopMiddle.add(jcmdModPlayerPoints);
					panelTopMiddle.add(jlblSpace3);
					panelTopMiddle.add(jcmdUnitAdd);
					panelTopMiddle.add(jcmdArmyMerge);
				
					panelTop.add(panelTopRight);
						panelTopRight.add(jcmdPrintPlayer);
						panelTopRight.add(jcmdSave);
						panelTopRight.add(jcmdLoad);
						panelTopRight.add(jlblSpace4);
						panelTopRight.add(jlblSpace5);
						panelTopRight.add(jlblSpace6);
						panelTopRight.add(jlblSpace7);
						panelTopRight.add(jlblSpace8);
						panelTopRight.add(jlblSpace9);
					
						panelTop.add(panelTopRightBottom);
							panelTopRightBottom.add(jcbPlayerArmyList2);
			
			basisPanel.add(panelMiddle);
				panelMiddle.add(panelMiddleLeft);
					panelMiddleLeft.add(jchbFlying);
					panelMiddleLeft.add(jchbMechanized);
					panelMiddleLeft.add(jchbTired);
					panelMiddleLeft.add(jchbFortified);
					panelMiddleLeft.add(jchbVigliant);
					panelMiddleLeft.add(jchbAntiScouting);
					panelMiddleLeft.add(jchbUnderArtilleryFire);
					panelMiddleLeft.add(jchbWithoutHQ);
				panelMiddle.add(jspArmyView);
	
			basisPanel.add(panelBottom);
			
			panelBottom.add(panelBottomLeft);
				panelBottomLeft.add(jlblPlayerFields);
				panelBottomLeft.add(jspViewPlayerFields);
				
			panelBottom.add(panelBottomMiddle);
				panelBottomMiddle.add(jcbFields);
				panelBottomMiddle.add(panelFieldPosition);
					panelFieldPosition.add(jlblPositionField);
					panelFieldPosition.add(jtxtFieldPosition);
				panelBottomMiddle.add(jcmdAddFieldtoPlayer);
				panelBottomMiddle.add(jcmdRemoveField);
				
			panelBottom.add(panelBottomRight);
				panelBottomRight.add(panelPlayerPoints);
					panelPlayerPoints.add(panelIAP);
						panelIAP.add(jlblIAP);
						panelIAP.add(jlblIAPPoints);
					panelPlayerPoints.add(panelTAP);
						panelTAP.add(jlblTAP);
						panelTAP.add(jlblTAPPoints);
					panelPlayerPoints.add(panelKP);
						panelKP.add(jlblKP);
						panelKP.add(jlblKPPoints);
					panelPlayerPoints.add(panelSP);
						panelSP.add(jlblSP);
						panelSP.add(jlblSPPoints);
					panelPlayerPoints.add(panelSTP);
						panelSTP.add(jlblSTP);
						panelSTP.add(jlblSTPPoints);
				panelBottomRight.add(jcmdClose);


		basisFrame.setVisible(true);
	}
}

Zum einen Kennt meine ActionListener die Buttons etc. nicht wenn ich diese nicht in der Klasse mit "private" oder "public" definiere. Gibt es eine Möglichkeit dass ich die Buttons in der actlGUI doch sehen kann auch wenn ich diese erst in der Methode MainGUItest() deklariere?

Zusätzlich muss ich ja anschliessend den Buttons die ActionList zuweisen, sprich folgendes:
Java:
button.addActionListener(actlGUI);
Bei meinem ersten GUI musste ich aber immer folgendes machen:
Java:
button.addActionListener(this);
sprich den Button übergeben dass er wusste was zu tun ist. Übersehe ich etwas? Bei mir scheint es nicht zu klappen. Im Code oben habe ich der "Combobox" jcbPlayer den Actionlistener bereits hinzugefügt (Zeile 204). Aber wenn ich den Button anklicke geschieht nichts...

Übersehe ich etwas in der Funktion des ActionListeners?

Danke schonmal für eure Hilfe.

Gruss
Kneubi

PS: mit dem GUI spare ich im vergleich zum vorherigen GUI immerhin gut 300 Zeilen Code ein :)
 

Michael...

Top Contributor
Erinnert mich ein bisschen an:
http://www.java-forum.org/java-basics-anfaenger-themen/144040-eigenstaendige-listener-klasse.html#post961095
Eine Steuerung ausserhalb der GUI Klasse - wenn die Referenz aus der GUI Klasse nicht greifbar ist - kann man das auch mittels setActionCommand auf den JButton und getActionCommand am ActionEvent realisieren.

Wenn ich mir einen Kommentar zu Deiner Klasse erlauben darf: Für eine so einfache GUI ist Deine Klasse viel zu sehr aufgebläht und meiner Meinung jetzt schon eher schlecht überschaubar und wartbar. Eine komplexe GUI derart aufgebaut wird für denjenigen der diese später einmal warten soll bzw. selbst für den Entwickler, wenn er nach ein paar Wochen/Monaten da mal wieder reinschaut ein Graus Da fehlt noch einigges an Grundlagenwissen und natürlich Erfahrung.
 

kneubi

Mitglied
Hallo Michael

Danke für die rasche Antwort :)

Danke auf jedenfall für den Link, dann muss ich mir da wieder den Code "auseinanderbeindeln" bis ich alles kapiere, irgendwann wirds schon werden.

Und solche Kommentare sind von mir sogar erwünscht, weil nur damit sehe ich, dass noch optimierungspotenzial da ist. Und ja, ich gebe zu mir fehlt die Erfahrung. Ich programmiere Java nun seit ca. 6 Monaten und habe mir alles selber beigebracht und alles nur "privat" für diese eine Applikation. Ich arbeite nicht als Entwickler sondern als Systemtechniker/Supporter und habe kaum Entwicklungserfahrung. Problem hierbei ist einfach, ich schaue mir "kleine Tutorials" von GUI's an. Für 2-3 Knöpfe sind die meistens so aufgebaut wie ich meines nun aufgebaut habe, ich habe aber noch nirgends ein Beispiel gefunden wie man grössere GUI's bauen sollte.

Bei dem Code oben komme ich selber aber definitiv besser dahinter wie alles funktioniert. Beim vorherigen habe ich mir den Code generieren lassen und war froh wenn ich wusste wo mein Button generiert wird und wo platziert...

Hast du mir einen Tipp wonach ich suchen soll für solche grösseren GUIs? In deinem Link habe ich gesehen dass du eine Liste für die "Schalter" verwendest(Habe ich das Richtig gesehen?). Desweitern versuche ich immer mehr LayoutManager zu verwenden, aber irgendwie tu ich mich damit sehr schwer weil ich es nicht so hinkriege wie ich es will oder muss irgendwelche "leere" Komponenten in ein GridLayout hinzufügen dass die Buttons an der richtigen stelle kommen...
 

Michael...

Top Contributor
Allgemeine Tipps kann ich da nicht wirklich geben. Ich versuche UIs nach Möglichkeit mit verschachtelten JPanels unter Nutzung von Border-, Grid- und manchmal FlowLayout zusammen zu bauen. Meiner Meinung kann man mit diesen dreien schon recht viel erreichen.

Ausserdem gilt den Geltungsbereich von Variablen möglichst klein zu halten. z.B. benötigt man in den wenigsten Fällen ein JScrollPane als Instanzvariable. Oftmals reicht ein
Code:
panel.add(new JScrollPane(myScrollableComponent))
- spart Codezeilen und es ist trotzdem ohne Probleme erkennbar was hier passiert.
Evtl. kann man die Referenzen auf gleiche Komponenten z.B. wie die Buttons in dem verlinkten Code in einem Array oder einer List halten.

Grundsätzlich würde ich mal prüfen, ob man die GUI nicht in Teilkomponenten unterteilen kann. Diese Teilkomponenten würde ich dann auch in eigenen Klassen abbilden und in einer "Gesamt" GUI einfach verbauen.
Gesteuert wird das ganze über eine zentrale Controller Instanz.
Grundsätzlich interessant sind verschiedene Entwurfsmuster, z.B.:
Model View Controller ? Wikipedia

Ich würde aber nicht unbedingt zwanghaft versuchen den/die ActionListener aus der GUI Klasse zu verbannen. Ich selbst arbeite gerne mit inneren anonymen (Action)Listenern, die - sofern sinnvoll - über ein ControllerInterface Informationen an den Controller weiter geben.
 

kneubi

Mitglied
Also die Buttons oder sagen wir "gleichen Komponenten" in eine List oder ArrayList zu packen macht aber nur sinn, wenn sie dann am gleichen ort alle direkt wieder ausgelesen werden oder? Anonsten wird es wohl eher mühsam in Panel1 die Komponenten 0 bis 3 rauszulesen und in Panel2 die Komponenten 4 und 5.

-> hier tut sich mir die frage auf, nimmst du Absichtlich "Array"? Array's haben ja im Java eine festdefinierte grösse, was hingegen Lists bzw. ArrayLists nicht haben oder? Gut bei einer GUI sollte man wissen wieviele Knöpfe darauf zu finden sind ;)

Was meinst du mit "Teilkomponenten"? Ich habe ja bei mir sozusagen 3 "Grundpanels", Top, Middle und Bottom, dazu auf jeden Panel dann noch 3 spalten. Meinst du hier z.B. jedes dieser Grundpanels in eine eigene Klasse zu packen?

Ich war mir am überlegen den ActionListener in eine eigene Klasse zu packen, aber das sieht für mich wieder komplizierter aus, Referenzen, woher kommen die Commands, Rückreferenzen auf die aufgerufenen Methoden.... usw...

Wenn ich das GUI aber irgendwie "aufspalten" kann finde ich die anonyme innere klasse bzgl. ActionListener auch nicht mehr so schlimm. Weil dieser dann nicht mehr 10x auftaucht. Ich wollte halt irgendwie unbedingt von diesem "implements ActionListener" weg.

Aber Danke für den Hinweis zum MVC. Ich hatte mir schon überlegt die Logik, sprich PlayerAdd-Methoden etc... in eine andere Klasse zu verschieben... dies werde ich wohl nun auch anfangen zu tun. So dass ich in der GUI-Klasse nur noch den GUI-Aufbau habe und dazu noch die Methodenaufrufe der ActionEvents..
 

Michael...

Top Contributor
Anonsten wird es wohl eher mühsam in Panel1 die Komponenten 0 bis 3 rauszulesen und in Panel2 die Komponenten 4 und 5.
Wie gesagt, dass macht nicht unbedingt immer Sinn.
-> hier tut sich mir die frage auf, nimmst du Absichtlich "Array"? Array's haben ja im Java eine festdefinierte grösse, was hingegen Lists bzw. ArrayLists nicht haben oder? Gut bei einer GUI sollte man wissen wieviele Knöpfe darauf zu finden sind
Genau, feste Anzahl --> Array
Was meinst du mit "Teilkomponenten"? Ich habe ja bei mir sozusagen 3 "Grundpanels", Top, Middle und Bottom, dazu auf jeden Panel dann noch 3 spalten. Meinst du hier z.B. jedes dieser Grundpanels in eine eigene Klasse zu packen?
Eventuell, ohne die genau Funktion zu kennen ist es schwer zu sagen, welche Einheiten sinnvoll sind. Eventuell kann man die "Liste" mit den CheckBoxen als eigene Komponente auslagern. Man kann auch nur einzelne Bereiche oder sich wiederholende "Baumuster" in einer private Methode erzeugen und das fertig "gefüllte" JPanel zurückgeben, so hat man zumindest in der Klasse eine gewisse Strukturierung.

Für Beschriftungslabels (Round, IAP...) macht es nicht unbedingt Sinn diese auch als Instanzvariable zu halten.
Lücken in GridLayout mit Dummy Komponenten zufüllen finde ich jetzt nicht so verwerflich, allerdings braucht man da nicht unbeding lokale Variablen erzeugen - einfach mit
Code:
add(new JPanel())
hinzufügen. Sind in Deinem Code zwar nur neue Zeilen - aber Kleinvieh macht auch Mist.
 

kneubi

Mitglied
Die GUI-programmierung wird mir mit deinen tipps langsam etwas klarer... vom ehemaligen GUI drag'n'drop und zusammenklicken zum zeile für zeile code optimierung :)danke für deine tipps

Was zu den funktionen zu sagen ist, oberer drittel ist eher für das manipulieren der objekte (hinzufügen/entfernen) der mittlere teil zeigt details/attribute der auswahlen vom oberen teil und der untere teil ist wieder manipulation/anzeigen weiterer daten.

player 1:mc army 1:mc unit 1:mc equipment
player 1:mc Fields
player 1:mc Points(IAP etc)

oberster teil ist die player und armyauswahl. zusätzlich noch nächste runde, pointmodifikation und datenausgabe
Mittlerer teil zeigt units und attribute der oben ausgewählten army an.
unterster teil zeigt die Fields und Points des ausgewählten spielers an

man könnte das gui wohl in 4-5 teile spalten...
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
T src ordner erstellen AWT, Swing, JavaFX & SWT 6
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
E Putzplan erstellen AWT, Swing, JavaFX & SWT 15
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L JavaFX PropertyView mit dynamischer EditCell erstellen? AWT, Swing, JavaFX & SWT 8
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
F Verzeichnis über GUI erstellen AWT, Swing, JavaFX & SWT 2
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
B JavaFX RadioButtons erstellen AWT, Swing, JavaFX & SWT 7
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
dereki2000 LookAndFeel Individuelles LAF erstellen AWT, Swing, JavaFX & SWT 9
C SWT Breadcrumb Zeile mit entsprechenden Hyperlinks erstellen AWT, Swing, JavaFX & SWT 0
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
L Chat erstellen AWT, Swing, JavaFX & SWT 13
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
K Aus 2 Arrays xy - Graph erstellen AWT, Swing, JavaFX & SWT 9
K Swing outerPanel und innerPanel erstellen AWT, Swing, JavaFX & SWT 4
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
Timo_neu_in_java Buttons Erstellen AWT, Swing, JavaFX & SWT 6
P JList erstellen AWT, Swing, JavaFX & SWT 4
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
J Statistik erstellen AWT, Swing, JavaFX & SWT 3
H GUI erstellen um JUnit Tests auszuführen AWT, Swing, JavaFX & SWT 29
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
Prafy Sich ändernde Farbverläufe erstellen AWT, Swing, JavaFX & SWT 4
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
D JavaFX build.fxbuild error beim Erstellen einer exe AWT, Swing, JavaFX & SWT 2
T JavaFX Flexible Layouts dynamisch erstellen / Design-Inspirationen AWT, Swing, JavaFX & SWT 8
J JavaFX JavaFX exe erstellen AWT, Swing, JavaFX & SWT 5
E JavaFX JavaFX - MenuItem erstellen aus dem Inhalt einer HashMap AWT, Swing, JavaFX & SWT 1
G Programm GUI erstellen AWT, Swing, JavaFX & SWT 5
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
M "(Buch-)Seiten" erstellen AWT, Swing, JavaFX & SWT 2
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
F JButtons erstellen lassen mit unterschiedlichen Funktionen AWT, Swing, JavaFX & SWT 3
T JPanel dynamisch erstellen AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
A Swing Frames richtig erstellen AWT, Swing, JavaFX & SWT 3
T Wizard mit NEXT Button erstellen AWT, Swing, JavaFX & SWT 11
D gerichteten Graph erstellen AWT, Swing, JavaFX & SWT 2
D Swing Ansichtstranformationsmatrix erstellen AWT, Swing, JavaFX & SWT 0
M JavaFX MSI oder EXE aus JavaFX Projekt erstellen? AWT, Swing, JavaFX & SWT 2
R Kästchen mit Zufallsfarben erstellen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
G Label erstellen AWT, Swing, JavaFX & SWT 6
G Blöcke erstellen AWT, Swing, JavaFX & SWT 4
K Swing Terminplaner erstellen AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
T An/aus Button erstellen AWT, Swing, JavaFX & SWT 5
A Swing Transparenten JPanel erstellen AWT, Swing, JavaFX & SWT 5
D Jahreskalender erstellen AWT, Swing, JavaFX & SWT 2
R Int aus JSpinner auslesen und Tabelle erstellen AWT, Swing, JavaFX & SWT 3
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
B Eigenen Look&Feel erstellen?! AWT, Swing, JavaFX & SWT 2
S Swing Kopie eines JPanels inkl. aller objekte darin erstellen AWT, Swing, JavaFX & SWT 5
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
C Border in JPanel erstellen AWT, Swing, JavaFX & SWT 4
P JTabbedPane per Menuitem erstellen AWT, Swing, JavaFX & SWT 20
B Swing invokeLater nötig beim GUI erstellen? AWT, Swing, JavaFX & SWT 10
V Swing Wochenplaner in Swing erstellen! Aber wie? AWT, Swing, JavaFX & SWT 13
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
P Neue Datei erstellen in JPanel AWT, Swing, JavaFX & SWT 5
V Guis erstellen mit FXML und javaFX gemischt AWT, Swing, JavaFX & SWT 5
B Swing JMenuButtons mit Funktionen aus Array erstellen AWT, Swing, JavaFX & SWT 4
B Bild direkt im Quelltext erstellen AWT, Swing, JavaFX & SWT 14
B Applet Aus Applet signiertes jar mit externen libs erstellen AWT, Swing, JavaFX & SWT 9
I Swing GUI "ordentlich" mit Guice erstellen AWT, Swing, JavaFX & SWT 2
B Java scatterplot mit Sticks effizient erstellen! AWT, Swing, JavaFX & SWT 2
R Java Desktop Anwendung erstellen. Womit? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben