Methoden Methode zur Erstellung von Buttons

unavailable

Mitglied
Ahoi,

ich arbeite zurzeit an einem Taschenrechner.
Ich habe meine Buttons manuell erstellt & laut
meinem Ausbilder soll ich Spaghetticode vermeiden & mir deshalb
eine Methode schreiben, welche mir meine Buttons automatisch erzeugt.

Taschenrechner

Momentaner Code zur Erstellung meiner Buttons:
Java:
        button = new JButton("7");
		c.insets = new Insets(2,2,2,2);
		c.gridx = 0;
		c.gridy = 1;
		button.setPreferredSize(new Dimension(41, 26));
		button.addActionListener(this);
		panel.add(button, c);
		
		button = new JButton("8");
		c.gridx = 1;
		c.gridy = 1;
		button.setPreferredSize(new Dimension(41, 26));
		button.addActionListener(this);
		panel.add(button,c);
                ...
                ...

Das ganze soll jetzt automatisch generiert werden.
Hätte mir das ganze so vorgestellt, dass ich eine generareButton()-Methode erstelle,
welcher ich Parameter zur Erstellung aller Buttons übergebe. Nur hab ich das objektorientierte Programmieren noch nicht drauf.
 
Zuletzt bearbeitet:
Wie wäre es mit einer Funktion, die einen String als Identifikationmerkmal entgegenimmt und einen JButton zurückgibt?

Java:
public JButton generateButton(String identification) {
JButton b = new JButton(identification);

//....

return b;
}

JFrame.add(generateButton("7");
 
Templarthelast postet die Lösung, aber wie kann man darauf nicht selber kommen?
was eine Methode ist, Klammern, auch nur Befehle drin, Rückgabewert,
das muss doch sowas von sitzen lange lange vor GUI-Anwendungen..

eine höhere Stufe wäre übrigens noch eine Schleife statt vieler Einzelaufrufe,
for i bis 10 oder was auch immer, anhand des i gridx+y berechnen usw.

das aber nur zum Spass/ für wirklich hunderte Buttons, die man eh nicht haben sollte, außer vielleicht bei Minesweeper, und auch dann gibts Alternativen,
Einzel-Methodenaufrufe sind aber schon sehr gut, 90% des Ziels geschafft, lobenswerte Erkenntnis, haben manche nicht
 
Templarthelast postet die Lösung, aber wie kann man darauf nicht selber kommen?
was eine Methode ist, Klammern, auch nur Befehle drin, Rückgabewert,
das muss doch sowas von sitzen lange lange vor GUI-Anwendungen..

eine höhere Stufe wäre übrigens noch eine Schleife statt vieler Einzelaufrufe,
for i bis 10 oder was auch immer, anhand des i gridx+y berechnen usw.

das aber nur zum Spass/ für wirklich hunderte Buttons, die man eh nicht haben sollte, außer vielleicht bei Minesweeper, und auch dann gibts Alternativen,
Einzel-Methodenaufrufe sind aber schon sehr gut, 90% des Ziels geschafft, lobenswerte Erkenntnis, haben manche nicht

Du hast recht, ich habe ich viel zu schnell auf die GUI-Programmierung gestürzt...
 
Aber das Problem dürfte sein, das noch wesentlich mehr Parameter mitgegeben werden müssten.

10x fein säuberlich untereinander
Java:
button = new JButton...;

button = new JButton...;

button = new JButton...;
ist imo auch nicht Spaghetticode.
 
Taschenrechner

Ich verstehe das mit dem Parameter übergeben nicht..
Ich habe die Buttons ja alle manuell erstellt & ihnen auch alle
benötigten Parameter übergeben.

Java:
        button = new JButton("=");
		c.gridx = 4;
		c.gridy = 3;
		c.gridheight = 2;
		button.setPreferredSize(new Dimension(41, 56));
		button.addActionListener(this);
		panel.add(button, c);

Das ist ein Button.
Das ganze für 18 Buttons ist schon bischen spaghettier als ne Funktion zu schreiben.

Allerdings komm ich nicht drauf, was ich dem Konstruktor alles mitgeben muss, damit er
mir das erstellt, was ich von ihm verlange.
 
schau dir einmal mehr den Code von Templarthelast an, da wird doch in der Untermethode ein Button erstellt, oder nicht?
funktioniert so weit,

panel.add() und das 'c' bleibt eben vorerst im Hauptprogramm,
genauso paar andere Befehle oder sie fehlen zwischenzeitlich

danach:
dir fällt auf dass keiner mehr ActionListener hat bzw. möchtest diese immer gleiche Methode verschieben?
einfach in der Methode diese Codezeile sinnvoll einbauen, gegebenenfalls außen 10fach streichen, falls noch da,

wenn dir das jetzt nicht sagt, dann wirklich ein Problem,
aber was ist da die Lösung, für jede simple Frage zum Forum? dann bleibe doch besser in diesem Fall bei dem alten Code,
wenn der lief war das schon viel wert

ansonsten
Schritt um Schritt umbauen, mit den Constraints c in der Tat nicht ganz leicht,
die könnten aber in die Methode wenn das panel auch mitkommt, entweder als Parameter oder sowieso allgemein bekannt,
dann dort Constraints erzeugen, das add() ausführen, Rückgabewert wäre nichtmal mehr nötig,
noch viel kürzer, mit add() wären es ja mindesten zwei Zeilen je Button beim Aufrufer, ohne add() nur noch eine
 
bspw. so...musst evtl. das gridX noch anpassen...

Java:
generateAndAddjButton("7", 1, 1, 1, 1, new Dimension(41, 56));
		generateAndAddjButton("8", 2, 1, 1, 1, new Dimension(41, 56));
		generateAndAddjButton("9", 3, 1, 1, 1, new Dimension(41, 56));
		generateAndAddjButton("/", 4, 1, 1, 1, new Dimension(41, 56));
		generateAndAddjButton("<", 5, 1, 1, 1, new Dimension(41, 56));
		generateAndAddjButton("4", 1, 2, 1, 1, new Dimension(41, 56));
...
public void generateAndAddjButton(String zeichen, int gridX, int gridY,
			int gridHeight, int gridWidth, Dimension d) {
		JButton button = new JButton(zeichen);
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = gridX;
		c.gridy = gridY;
		c.gridheight = gridHeight;
		c.gridwidth = gridWidth;
		button.setPreferredSize(d);
		button.addActionListener(this);
		panel.add(button, c);
	}
 
Evtl. auch den erstellten Button zurückgeben lassen, das wäre gui builder like und man könnte die listener adden
 
Codewiederholung ? Wikipedia
ist auch schon ein Fachbegriff, hier der richtige

@jgh
3 von 6 Parametern, besonders die riesige Dimension, sind im Moment immer gleich
-> einsparen, in der Methode als Defaultwert,
erst wenn nötig als Parameter, dann reicht vielleicht auch x, y als einfache ints, nicht die dicke Dimension
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben