Problem mit Komponenten Anordnung mit einem GribagLAyout

CaS

Grünschnabel
Hallöchen,

ich soll für die Schule ein ziemlich unfangreiches Teil schreiben und möchte daher dass das Ding so gut wie möglich aussieht....

Nun habe ich aber ein Problem mit meinem mit der Größe und Anordnung einiger Komponenten.....

Ich benutze das GridbagLayout und habe z.B. JTabbedPane auf mein Center Panel gelegt....ich kann aber weder die Position noch Größe meines Tabpanes bestimmen...ich würde gerne das es in der oberen rechten ecke des Bildschrims und über das ganze Center Panel angezeigt wird.......gridx und gridy und sowas hab ich schon probiert....hat irgendwie nicht so richtig funktioniert

hier meine Fenster Klasse.......

Code:
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;

import model.MeinADM;
import model.TableSorter;
import controller.ButtonAdapter;
import controller.ButtonAdapterBerechnen;
import controller.ButtonAdapterEntfernePartei;
import controller.ButtonAdapterNeuePartei;
import controller.ButtonAdapterTabpane;


/**
 * 
 * @author bannert
 * Demo vom 14.Mai 2013 - swing-Fenster mit Layouts und Widgets
 * Array mit RadioButton hinzugefügt und Ereignisbehandlung hinzugefügt. 
 * Menuleiste eingebaut.
 * JTable mit abstraktem Datenmodell eingebaut.
 */
public class MeinFenster extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	//Attribute 
	private JTextField txName;
	private JTextField txGesamtanzahlMandate;
	private JTextField txGesamtanzahlStimmen;
	private JTextField txwahlkreis;
	private JTextField txabgeordnete;


	private JLabel lbAusgabe ;
	private JTabbedPane tabpane;


	private JTable tableTab1 ;
	private JTable tableTab2 ;
	
	private int schalter;
	
//	private final int MAX = 2;
//	private JRadioButton[] rb = new JRadioButton[MAX]; // Array für RadioButton
//	private ButtonGroup rbGroup = new ButtonGroup();;

	
	private JTextPane txPane = new JTextPane();

	
//	public JRadioButton[] getRb() {
//		return rb;
//	}
//
//	public void setRb(JRadioButton[] rb) {
//		this.rb = rb;
//	}

	// Default -Konstruktor
	public MeinFenster() throws HeadlessException {
		this("Mein Fenster");
	}

	public JTextField getTxName() {
		return txName;
	}

	public void setTxName(JTextField txName) {
		this.txName = txName;
	}

	public JLabel getLbAusgabe() {
		return lbAusgabe;
	}

	public void setLbAusgabe(JLabel lbAusgabe) {
		this.lbAusgabe = lbAusgabe;
	}		
	
	public String getTxGesamtanzahlMandate() {
		return txGesamtanzahlMandate.getText();
	}
	
	public JTextField getTxGesamtanzahlStimmen() 
	{
		return txGesamtanzahlStimmen;
	}
	
	public void setTxGesamtanzahlStimmen(String inhalt) {
		this.txGesamtanzahlStimmen.setText(inhalt);
		
	}
	
	public JTabbedPane getTabpane() {
		return tabpane;
	}
	
	public int getSchalter() 
	{
		return schalter;
	}

	public void setSchalter(int schalter) 
	{
		this.schalter = schalter;
	}

	public JTable getTabelleTab1() {
		return tableTab1;
	}

	public void setTabelleTab1(JTable tabelle) {
		this.tableTab1 = tabelle;
	}
	
	public JTable getTabelleTab2() {
		return tableTab2;
	}

	public void setTabelleTab2(JTable tabelle) {
		this.tableTab2 = tabelle;
	}
	
	public MeinFenster(String titel) throws HeadlessException {
		super(titel);
		
		// schließen des Fenster
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// Menüleiste auf Fenster legen -------------
		this.setJMenuBar(new MenuLeiste(this));
		//-------------------------------------------
		
		// Content Pane holen
		Container cpane = this.getContentPane();
		
		// BorderLayout für die ContentPane einstellen
		BorderLayout blayout = new BorderLayout();
		cpane.setLayout(blayout);
		
		// Fünf Panel auf die Bereiche des Borderlayouts legen
		JPanel pnlNord = new JPanel();
		JPanel pnlSued = new JPanel();
		JPanel pnlWest = new JPanel();
		//JPanel pnlOst = new JPanel();
		JPanel pnlMitte = new JPanel();

		
		// Border einstellen für Panel
		pnlNord.setBorder(BorderFactory.createLineBorder(Color.BLUE));
		pnlNord.setBackground(Color.BLUE);
		pnlSued.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		pnlWest.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		//pnlOst.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		pnlMitte.setBorder(BorderFactory.createLineBorder(Color.GRAY));

		
		// alle fünf Panel auf die Content Pane legen
		
		cpane.add(pnlNord, BorderLayout.NORTH);
		cpane.add(pnlSued, BorderLayout.SOUTH);
		cpane.add(pnlWest, BorderLayout.WEST);
		//cpane.add(pnlOst, BorderLayout.EAST);
		cpane.add(pnlMitte, BorderLayout.CENTER);

		
		// GridBagLayoutManager für fünf Panel einstellen
		GridBagLayout gridlayout = new GridBagLayout();
		pnlNord.setLayout(gridlayout);
		pnlSued.setLayout(gridlayout);
		pnlWest.setLayout(gridlayout);
		//pnlOst.setLayout(gridlayout);
		pnlMitte.setLayout(gridlayout);

		
		// Nun Widgets konstruieren und auf die Panel legen
		// fangen wir an mit dem Nordpanel (die Reihenfolge spielt aber keine Rolle)
		
		// NordPanel -----------------------
		GridBagConstraints constrNord = new GridBagConstraints();
		
		// Label
		JLabel lbName = new JLabel("Die meisten Mandate hat die Partei...");
		lbName.setForeground(Color.yellow);
		constrNord.gridx = 0;
		constrNord.gridy = 0;
		constrNord.anchor = GridBagConstraints.WEST;
		pnlNord.add(lbName, constrNord);
		
		// Textfield
		//txName = new JTextField(20 );
		//constrNord.gridx = 10;
		//constrNord.gridy = 0;
		//constrNord.anchor = GridBagConstraints.EAST;
		//pnlNord.add(txName, constrNord);
		
		// Label 
		// lbAusgabe = new JLabel("          ");
		// constrNord.gridx = 0;
		// constrNord.gridy = 10;
		// constrNord.anchor = GridBagConstraints.CENTER;
		// constrNord.gridwidth = GridBagConstraints.REMAINDER;
		// pnlNord.add(lbAusgabe, constrNord);
		 
		 
		 
		// SuedPanel -----------------------
		GridBagConstraints constrSued = new GridBagConstraints();
		
//		//Radio Buttons
//		for(int i = 0;i< rb.length; i++){
//			if(i==0)
//			{
//				rb[i] = new JRadioButton("Hare/Niemeyer");
//				
//			}
//			if(i==1)
//			{
//				rb[i] = new JRadioButton("d'Hondt");
//				
//			}
//			constrSued.gridx = 20;
//			constrSued.gridy = 15+i;
//			constrSued.anchor = GridBagConstraints.SOUTH;
//			
//			pnlSued.add(rb[i], constrSued);
//			
//			// ohne RadioButton-Group funktionieren die RadioButton wie Checkboxen
//			rbGroup.add(rb[i]); // button in die Group legen
//			
//			// Listener anbinden
//			rb[i].addActionListener( new RadioButtonAdapter( this) );
//		}
//		// eine Button auswählen, der angewählt ist.
//		rb[0].setSelected(true);
		
		// JLabel Gesamtzahl Mandate
		JLabel GesamtzahlMandate = new JLabel("Gesamtzahl Mandate:");
		constrSued.gridx = 5;
		constrSued.gridy = 15;
		pnlSued.add(GesamtzahlMandate, constrSued);
		
		
		// JLabel Gesamtzahl Stimmen
		JLabel GesamtzahlStimmen = new JLabel("Gesamtzahl Stimmen:");
		constrSued.gridx = 5;
		constrSued.gridy = 16;
		pnlSued.add(GesamtzahlStimmen, constrSued);
		
		// JLabel Wahlkreis
		JLabel Wahlkreis = new JLabel("                  Wahlkreis:");
		constrSued.gridx = 5;
		constrSued.gridy = 18;
		pnlSued.add(Wahlkreis, constrSued);
		
		// JLabel Abgeordnete
		JLabel Abgeordnete = new JLabel("Anzahl Abgeordnete:");
		constrSued.gridx = 5;
		constrSued.gridy = 20;
		pnlSued.add(Abgeordnete, constrSued);
		
		// Textfield Gesamtanzahl  Mandate
		txGesamtanzahlMandate = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 15;
		pnlSued.add(txGesamtanzahlMandate, constrSued);
		
		// Textfield Gesamtanzahl  Stimmen
		txGesamtanzahlStimmen = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 16;
		pnlSued.add(txGesamtanzahlStimmen, constrSued);
		
		// Textfield Wahlkreis
		txwahlkreis = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 18;
		pnlSued.add(txwahlkreis, constrSued);
		
		// Textfield Abgeordnete
		txabgeordnete = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 20;
		pnlSued.add(txabgeordnete, constrSued);
		
		// Button Neue Partei
		JButton btNeuePartei = new JButton("   Neue Partei   ");
		constrSued.gridx = 10;
		constrSued.gridy = 15;
		constrSued.weightx = 1.0; // Gewichtung
		constrSued.weighty = 1.0; // Gewichtung
		//constrSued.fill = GridBagConstraints.HORIZONTAL;
		pnlSued.add(btNeuePartei, constrSued);
		
		btNeuePartei.addActionListener(new ButtonAdapterNeuePartei( this));
		
		
		// Button Entferne Partei
		JButton btEntfernePartei = new JButton("Entferne Partei");
		constrSued.gridx = 10;
		constrSued.gridy = 18;
		constrSued.weightx = 1.0; // Gewichtung
		constrSued.weighty = 1.0; // Gewichtung
		//constrSued.fill = GridBagConstraints.HORIZONTAL;
		pnlSued.add(btEntfernePartei, constrSued);
		
		btEntfernePartei.addActionListener(new ButtonAdapterEntfernePartei( this));
		
		// Button Berechne
		JButton btOK = new JButton("Berechnen");
		constrSued.gridx = 30;
		constrSued.gridy = 16;
		constrSued.weightx = 1.0; // Gewichtung
		constrSued.weighty = 1.0; // Gewichtung
		//constrSued.fill = GridBagConstraints.HORIZONTAL;
		pnlSued.add(btOK, constrSued);
		
		// Dieser Button soll auf ein Ereignis reagieren
		// Listener an das Quellobjekt anbinden
		//btOK.addActionListener(new ActionAdapterButton());	
		btOK.addActionListener(new ButtonAdapterBerechnen( this));
		
		// CenterPanel ---------------------
		GridBagConstraints constrCenter = new GridBagConstraints();
		
		
		// CenterPanel ------Tab Hare/niemeyer---------------
		 

		Object dataTable1[][] = {{"Partei 1"}, {"Partei 2"}, {"Partei 3"}, {"Partei 4"}};
		String feldnameTable1[] = {  "Parteiname", "Stimmen", "Division", "Gewonnene Mandate", "Rest Mandate", "Gesamt Mandate" };
		DefaultTableModel modelTable1 = new DefaultTableModel(dataTable1, feldnameTable1);
		tableTab1 = new JTable(modelTable1);
		JScrollPane scrPaneTableTab1 = new JScrollPane(tableTab1);
		
		
		// JTabel ins CenterPanel legen ----------------
		
		//MeinADM adm = new MeinADM(); // abstraktes Datenmodell
		//TableSorter meinSorter	= new TableSorter( adm ); // TabelSorter

		// CenterPanel ------d'Hondt---------------
		
		Object dataTable2[][] = {{"1"}, {"2"}, {"3"}};
		String feldnameTable2[] = {  "Divisor", "Partei 1", "Partei 2", "Partei 3" };
		DefaultTableModel modelTable2 = new DefaultTableModel(dataTable2, feldnameTable2);
		tableTab2= new JTable(modelTable2);
		JScrollPane scrPaneTableTab2 = new JScrollPane(tableTab2);
		//meinSorter.setTableHeader( 	tabelle.getTableHeader() );
		
		 // Scrollpane
		//scrPaneTabelle.setPreferredSize(new Dimension(120,100));
		tabpane = new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT );
		tabpane.addTab("Hare/Niemeyer", scrPaneTableTab1);
		tabpane.addTab("d'Hondt", scrPaneTableTab2);
		
		tabpane.addChangeListener(new ButtonAdapterTabpane(this));

		pnlMitte.add(tabpane, constrCenter);
		
		
		// Panel West ----------------------------------
		GridBagConstraints constrWest = new GridBagConstraints();
		constrWest.gridx = 0;
		constrWest.gridy = 0;
		constrWest.anchor = GridBagConstraints.WEST;
		
		// TextArea in Scrollpane auf das WestPanel legen
		JScrollPane scrPane = new JScrollPane(txPane);
		scrPane.setPreferredSize(new Dimension(200,200));
		pnlWest.add(scrPane, constrWest);
		
		// puh! das war ganz schön viel!
	}// end of Konstruktor

	/**
	 * Diese methode kann den Inhalt einer LinkedList in der TextArea anzeigen.
	 * @param zeilen (LinkedList) - alle Zeilen befinden sich in der LinkedList 
	 */
	public void dateiInhaltAnzeigen ( LinkedList <String> zeilen){
		
		Iterator <String>it = zeilen.iterator();
		String zeile = "";
		
		while( it.hasNext()){	
			zeile += it.next();
			zeile += System.getProperty("line.separator");
		}
		txPane.setText(zeile);	
	}
	

	/** 
 	* updateLAF
 	* lafStyle = 		 	
 	*	"javax.swing.plaf.metal.MetalLookAndFeel",
	*	"com.sun.java.swing.plaf.motif.MotifLookAndFeel",
	*	"com.sun.java.swing.plaf.windows.WindowsLookAndFeel",
	*	"com.sun.java.swing.plaf.gtk.GTKLookAndFeel",
	*	"com.sun.java.swing.plaf.motif.MotifLookAndFeel"
 	* ------------------------------------------
 	* look & feel einstellen
 	* ------------------------------------------
 	*/
	 void updateLAF(String lafStyle){
	 		System.out.println("updateLAF = " + lafStyle);
			
			try{		
				UIManager.setLookAndFeel( lafStyle );
				SwingUtilities.updateComponentTreeUI( this );		
			}
			catch(Exception ex){
				System.out.println("Fehler beim L&F " + ex.getMessage());
			}			
			this.pack(); // alles schön packen
	} 
	// innere Klasse
//	class ActionAdapterButton implements ActionListener{
//
//		public void actionPerformed(ActionEvent arg0) {
//			System.out.println("Test Button klick");
//		}
//		
//	}// end of inner class
	 

}// end of class

...ich wäre jedem sehr dankbar der mir bei meinem Problem weiterhelfen könnte....
 
Also an deiner Codequalität müssen wir noch arbeiten, so viel steht fest.

Dein Problem ist aber schnell behoben. Nach Zeile 351, also die Zeile, in der die Constraints für das CenterPanel erzeugt werden, kommen noch diese Zeilen:
Java:
constrCenter.weightx = 1;
constrCenter.weighty = 1;
constrCenter.fill = GridBagConstraints.BOTH;
Es wurden von dir ja auch keine Constraints gesetzt, wie soll sich dann da was tun ... Damit sich eine Komponente streckt, muss eben dieses Streckverhalten mitgeteilt werden und das fehlte da.
 
Jo Akeshihiro vielen Dank für deine schnelle und kompetente Antwort hat alles Super Top geklappt......

Ich werde im Laufe der Aufgabe wahrscheinlich noch andere Fragen haben kann ich sie dann im diesem Thema posten oder soll ich ich extra ein neues Thema ins Forum stellen.....

...ach ja und ich würde außerdem noch gerne wissen auf was ich den bei meinem Code achten sollte damit die Codequalität stimmt.....ich hab wirklich versucht auf objektorientierung, datenkapselung und auch auf andre Konventionen zu achten......
 
Also mir ist das egal, von mir aus kannst du die Fragen auch hier stellen. Aber in der Regel sollte man bei einem neuen Problem auch einen neuen Thread öffnen. Das hat auch nichts mit Mehraufwand zu tun, sondern dient vielen anderen Sachen, z.B. Übersichtlichkeit. Und wenn zu viel in einem Thread passiert, kann das spätere Leser nur unnötig verwirren, weil zu viele verschiedene Probleme in einem Thread besprochen werden und gar nicht klar ist, worum es eigentlich geht.

Zur Codequalität: Das war kein Angriff oder sowas. Im Grunde hast du ja auch recht. Ich weiß zwar nicht, wie lange du nun programmierst, insofern kann das schon ein gutes Ergebnis sein. Aber es gibt da Konstrukte, die schon seltsam aussehen. Der Konstruktor z.B. ist viel zu groß, zu unübersichtlich, zu unkoordiniert. Wenn du ihn dir genauer anschaust, wird dir bestimmt auch auffallen, dass sich da vieles im Grunde wiederholt -> in Methode auslagern. Das ist auch sonst ein guter Tipp, denn eine Methode sollte immer nur eine Aufgabe erledigen. Sollten es mehr Aufgaben sein, dann sollte man diese auf unterschiedliche Methoden auslagern. Macht nicht nur den Code schöner, sondern auch wartbarer und wesentlich viel besser lesbar, da es nicht zuletzt auch die unnötigen Kommentare spart. Kommentare sind gut, sollten aber auch sinnvoll eingesetzt werden. Meistens kann man dies aber vermeiden, denn wird irgendwo ein Kommentar geschrieben, ist das ein Indiz dafür, dass man die nachfolgenden Zeilen als separate Methode mit sprechendem Namen auslagern sollte, da eine zusätzliche Aufgabe erledigt werden muss. Deswegen findet man bei guten Codes eher selten Kommentare, nur Javadocs. Und lass dir da auch von niemandem was einreden, schon gar nicht von Lehrern. Wenn ein Kommentar benötigt wird, um einen "schlechten" Code zu erläutern, dann muss was an dem Code geändert werden und nicht ein Kommentar drüber. Ja, sonst ... Warum hast du public Getter für die Komponenten? Auf den ersten Blick mag es toll sein, wenn man aus anderen Klassen die grafischen Komponenten zugreifen kann. Das bindet aber. Stell lieber passende Schnittstellen bereit, also Methoden, um die entsprechenden Werte zu setzen oder zu holen, aber niemals direkt auf Komponenten dafür zugreifen. Das findet gekapselt in der implementierenden Klasse statt und sonst nirgendwo, keine andere Klasse sollte Zugriff auf die grafische Komponenten einer Klasse haben, ist unsauber und führt zu Problemen.

Naja, paar andere Sachen gibts bestimmt auch und ich kenne nicht deinen gesamten Code, da gibts bestimmt noch mehr. Ist ja auch nur als Anregung gedacht und soll helfen es in Zukunft besser zu machen.
 
Also ich muss dazu sagen das unsere Professorin ein gutes Stück dieses Codes für uns bereitgestellt hat, also ich hab das jetzt nicht alles selbst geschrieben.

Ich habe deine Kritik auch nicht als Angriff wahrgenommen ganz im Gegenteil ich freue mich über Leute die mir ihre Meinung sagen können bzw. mir auch einige Anregungen liefern können.

Zu deinen Anregung das die Codewiederholungen in eigene Mehtoden geschireben werden die mit einer Aufgabe versehen werden ist mir bewusst, genauso wie die unnötigen Kommentare...darum werde ich mich kümmern wenn ich mit meinem Projekt etwas weitergekommen bin....was ich besonders Interessant finde ist die Sache mit den public gettern Methoden....ich würde sehr gerne die grafischen Kompenenten des Fenster anders in anderen Klassen aufrufen und bearbeiten doch leider fehlt mir hier ein wenig das wissen wie ich anders als direkt auf die Komponenten zugreifen könnte.......die getters und setters methoden ist ein sache die ich einfach verstanden habe und seitddem damit umgehen kann......
aufjedenfalll bin ich dir sehr dankbar für deine Hilfe, Anregungen und Kritik.....falls ich noch Fragen haben sollte werde diese in einem Thread stellen
 
bezüglich Kommentaren:
Ich bin der Meinung, dass es durchaus Sinn machen kann, eher zuviel zu kommentieren, wenn man ein Neuling ist. Wir haben damals auch Algorithmen zuerst in Worte gefasst und mal so in die Files geschrieben und dann ausprogrammiert. Es hilft auch, wenn man noch nicht so fit in "Code lesen" ist, damit man den Code besser interpretieren kann.
Später aber muss man das auch nicht mehr machen, dann gilt so die Regeln "Kommentiere WARUM du etwas machst, nicht WAS du machst". So quasi: Wenn man kommentieren muss, was man macht, ist der Code nicht lesbar. Warum man etwas macht kann was sein wie "Daten als Paging laden, da ansonsten der Heap volläuft".

Gruss,
slowy
 
Was Akeshihiro meint ist: Versuch deine Komponenten besser zu kapseln. Gib nicht über einen Getter die Komponenten zurück, sondern erstelle ein Kontrakt was von außen her sichtbar ist. Folgendes Codebeispiel: Mein Programm hat ein kleines Fenster mit einem Button. Jeder der dieses Fenster erstellt, hat die Mögichkeit den Button zu konfigurieren. Er kann mit "buttonTextIst" den Button text editieren, "legButtonGroesseFest" die Größe des Buttons festlegen und mit "gibButtonVerhalten" das Verhalten des Buttons konfigurieren. Somit kannst du das Frame nun konfigurieren, ohne die Komponenten frei zu geben. Meist willst du das auch gar nicht, denn sonst bietest du anderen die Möglichkeit ZU VIEL zu konfigurieren. Ich hoffe ich hab mich klar ausgedrückt :S.

Code:
public class Main {

    public static void main(String[] args) {
        EinFrame einFrame = new EinFrame("Erstes Frame");
        einFrame.legButtonGroesseFest(100, 200);
        einFrame.gibButtonVerhalten(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Erstes Frame");
            }
        });
        einFrame.buttonTextIst("Erster Button");
        einFrame.setVisible(true);

        EinFrame zweitesFrame = new EinFrame("Zweites Frame");
        zweitesFrame.legButtonGroesseFest(100, 200);
        zweitesFrame.gibButtonVerhalten(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Zweites Frame");
            }
        });
        zweitesFrame.buttonTextIst("Erster Button");
        zweitesFrame.setVisible(true);

    }

}

Code:
public class EinFrame extends JFrame {
    private JButton button = new JButton();

    public EinFrame(String titel) {
        super(titel);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        add(button);
    }

    public void buttonTextIst(String buttonText) {
        button.setText(buttonText);
    }

    public void legButtonGroesseFest(int width, int height) {
        button.setSize(width, height);
    }

    public void gibButtonVerhalten(ActionListener actionListener) {
        button.addActionListener(actionListener);
    }

}

Zu den Kommentaren: Gerne zum Verständnis als Anfänger. Aber es sollte immer weniger werden, denn Kommentare haben die Eigenschaft bei Codeänderung vergessen zu werden. Und es gibt nichts schlimmeres als lügende Kommentare. Mir ist lieber kein Kommentar als ein lügender.
 
Zuletzt bearbeitet:
Zurück