Nicht benannte Buttons - Wenn gedrückt > Action

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,
ich habe hier viele Buttons (für einen Taschenrechner -> als kleine Übung), doch diese Buttons haben ja keinen Namen! Wie verleihe ich ihnen dann Action wenn ich zB.: auf 1 drücke?

Code:
void createGuiAndShow()
    {
        setTitle("Taschenrechner");
        setSize(200, 240);
        setResizable(false);
        add(display, BorderLayout.NORTH);
        add(nummernblock);
        
        nummernblock.add(new Button("%"));
        nummernblock.add(new Button("/"));
        nummernblock.add(new Button("*"));
        nummernblock.add(new Button("Exit"));
        
        nummernblock.add(new Button("7"));
        nummernblock.add(new Button("8"));
        nummernblock.add(new Button("9"));
        nummernblock.add(new Button("C"));
        
        nummernblock.add(new Button("4"));
        nummernblock.add(new Button("5"));
        nummernblock.add(new Button("6"));
        nummernblock.add(new Button("+"));
        
        nummernblock.add(new Button("1"));
        nummernblock.add(new Button("2"));
        nummernblock.add(new Button("3"));
        nummernblock.add(new Button("-"));
        
        nummernblock.add(new Button("."));
        nummernblock.add(new Button("0"));
        nummernblock.add(new Button("CE"));
        nummernblock.add(new Button("Enter"));
        
        display.setEditable(false);
        display.setText(anzeige);
        
        setVisible(true);
    }

Danke
MfG
 

Escorter

Bekanntes Mitglied
Warum speicherst du die Buttons nicht in Variablen?

Als alternative könntest du JButton vererben:
Code:
class Taste extends JButton{
 public Taste(){
  addActionListener(new myListener(this));
 }
}
class myListener() implements ActionListener{

String buttonText;

public myListner(JButton b){
 buttonText = b.getText();
}

public void actionPerformed(){
if(b.equals("+")){
add();
}
....
}

}

Gruß
Esco
 
G

Guest

Gast
Weil ich mir gedacht habe das es doch auch so irgendwie gehen sollte oder täusche ich mich da?
 

Escorter

Bekanntes Mitglied
Wie gesagt vererbe JButton und setzte einen Listener.

Dann musst du halt wie oben beschrieben, den Text des Buttons auslesen damit der Listener weiß was er tun muss.

Gruß,
Esco
 
G

Guest

Gast
Kann man ihn nicht gleich nach dem Text suchen lassen anstatt ihn zu sagen welcher Button den Text haben könnte/hat?
 

Escorter

Bekanntes Mitglied
wie willst du auf den text zu greifen?
der actionlistener ist ne eigene klasse.
Also hast du ein paar möglichkeiten.

1. beim konstruktor entscheiden welche actionlistener benutzt werden soll - schlechte lösung
2. beim konstruktor den button text mitgeben - funzt solange wie sich der button text nicht zur laufzeit ändert
3. den ganzen button an den actionlustener weitergeben.

Gruß,
Esco
 

Maeher

Bekanntes Mitglied
Wenn du unbedingt Text haben willst, kannst du auch (AbstractButton).setActionCommand verwenden. Diesen Text kannst du aus dem ActionEvent auslesen, dann würde dir ein Listener für alle reichen.
 

Escorter

Bekanntes Mitglied
Bei meiner Lösung reicht auch ein Listener.

Aber irgendwie muss man erkennen, welcher button gedrückt wurde - und wie, wenn nicht über den text?

Gruß,
Esco
 
G

Guest

Gast
Ich habe mich jetzt für diese Lösung entschieden:


Code:
void createGuiAndShow()
    {
        setTitle("Taschenrechner");
        setSize(265, 300);
        setResizable(true);
        add(display, BorderLayout.NORTH);
        add(nummernblock);
        
        button[0] = new JButton("%");
        button[1] = new JButton("/");
        button[2] = new JButton("*");
        button[3] = new JButton("Exit");
        button[4] = new JButton("7");
        button[5] = new JButton("8");
        button[6] = new JButton("9");
        button[7] = new JButton("C");
        button[8] = new JButton("4");
        button[9] = new JButton("5");
        button[10] = new JButton("6");
        button[11] = new JButton("+");
        button[12] = new JButton("1");
        button[13] = new JButton("2");
        button[14] = new JButton("3");
        button[15] = new JButton("-");
        button[16] = new JButton(".");
        button[17] = new JButton("0");
        button[18] = new JButton("CE");
        button[19] = new JButton("Enter");
        
        for(int i = 0; i < 20; i++)
            nummernblock.add(button[i]);
        
        display.setEditable(false);
        paint();
        setVisible(true);
    }
 

Escorter

Bekanntes Mitglied
du musst einen action Listener dem Button zuweisen...

Code:
for(int i = 0;i<button.length;i++){
button[i].addActionListener(button[i]);
}

public myListner(JButton b){
buttonText = b.getText();
}

public void actionPerformed(){
if(b.equals("+")){
 // Deine Action
}
....
}

Gruß,
Esco
 

Marco13

Top Contributor
Von JButton erben, nur um ihm einen ActionListener zuzuweisen ist ... :autsch: suboptimal.

Du kannst z.B. mal hier nachsehen: http://www.java-forum.org/de/viewtopic.php?p=310844
Statt eines direkten Vergleiches wie
Code:
if (event.getSource() == buttonSoUndSo) {...}
kann man ggf. auch das ActionCommand abfragen, wie es schon angedeutet wurde.
Code:
if (event.getActionCommand().equals("+")) {...}
aber da muss man ein bißchen aufpassen, dass es nicht zu unübersichtlich wird. Du solltest auch in Erwägung ziehen, die Buttons zu gruppieren:
Code:
JButton numberButtons[] = new JButton[10]; // 0 ... 9
JButton operatorButtons[] = new JButton[5]; // +, -, * ...
JButton functionButtons[] = new JButton[5]; // C, CE, ...
Dann kann man ggf. für jede Gruppe denselben ActionListener verwenden, und es ist einfacher, zu entscheiden, was jeweils gemacht werden soll. (Z.B. muss man für alle Numbers nur das ActionCommand in einen int umwandeln, und bei den operatoren nur das erste Zeichen des ActionCommands lesen, und kann dann ein switch über '+', '-', '*' usw machen...)
 

Marco13

Top Contributor
Naja ... übertrieben konsequent weitergeführt klingt das irgendwie nach sowas wie
Code:
class ListWithNames extends ArrayList
{
    public ListWithNames()
    {
        add("Alice");        
        add("Bob");
    }
}
... :? Das würde ja auch kein Mensch machen. (halt: Das sollte ja kein Mensch machen :wink: )

Und ganz allgemein, konzeptionell... welche Idee soll denn dahinter stecken? Der Button wird weder um echte Eigenschaften, noch um Methoden erweitert.

Es KÖNNTE zwar manchmal vielleicht Sinn machen, von einer Klasse abzuleiten, um sie als eigenständigen Typ (zwar nicht mit zusätzlichen, aber mit bestimmten Eigenschaften) vorliegen zu haben (insbesondere wenn z.B. abzusehen oder geplant ist, dass in Zukunft noch Eigenschaften oder Methoden dazukommen) aber in diesem speziellen Fall sehe ich da keinen Grund... :?
 

Verjigorm

Top Contributor
Marco13 hat gesagt.:
Naja ... übertrieben konsequent weitergeführt klingt das irgendwie nach sowas wie
Code:
class ListWithNames extends ArrayList
{
    public ListWithNames()
    {
        add("Alice");        
        add("Bob");
    }
}
... :? Das würde ja auch kein Mensch machen. (halt: Das sollte ja kein Mensch machen :wink: )

Und ganz allgemein, konzeptionell... welche Idee soll denn dahinter stecken? Der Button wird weder um echte Eigenschaften, noch um Methoden erweitert.

Es KÖNNTE zwar manchmal vielleicht Sinn machen, von einer Klasse abzuleiten, um sie als eigenständigen Typ (zwar nicht mit zusätzlichen, aber mit bestimmten Eigenschaften) vorliegen zu haben (insbesondere wenn z.B. abzusehen oder geplant ist, dass in Zukunft noch Eigenschaften oder Methoden dazukommen) aber in diesem speziellen Fall sehe ich da keinen Grund... :?

hey, schöne Idee zur Initalisierung einer Arraylist, muss ich mir merken!
 

siriuswhite

Aktives Mitglied
Denk an die ActionCommands
Code:
//button wäre der Name vom Button
button.setActionCommand("button");
//musst natürlich "button durch dein Action Command(aber mit "") ersetzen


//später im Listener
public void actionPerformed(ActionEvent evt)
{
  if(evt.getActionCommand.equals("button"))
   //mach was der button machen soll
}
So mach ichs immer
(kann aber sein dass es nur mit JButton geht,weiß ich nicht so genau)
 

Escorter

Bekanntes Mitglied
Wo ist der Vorteil wenn ich action command statt den text benutze?

Das einzige was mir spontan einfällt das ich die gleiche Aktion von verschiedenen Buttons aus ausführen kann.

Gruß,
Esco
 

Marco13

Top Contributor
... oder die gleiche Aktion von verschiedenen Buttons :wink: Oder dass man einem Button eine Aktion zuweisen kann, der keinen Text, sondern nur ein Icon enthält, oder einem Button eine feste Aktion geben kann, obwohl die Aufschrift des Buttons sich ändert, und dass man sich evtl. das Leben erleichtert, wenn man mal eine Internationalisierte Anwendung schreiben will... Aber meistens besteht trotzdem kein direkter Grund, warum man "immer" das ActionCommand per Hand setzen sollte... :?
Für einige dieser Sachen wären vielleicht auch Actions günstiger als spezielle ActionListener, aber das muss man von Fall zu Fall entscheiden...
 

Escorter

Bekanntes Mitglied
Ok überzeugt.

Aber ich denke ich blaib für mich dabei für jede Action einen eigenen ActionListener zu schreiben, denn dann ist es mir egal welcher Button die Action auslößt...


Gruß,
Esco
 

Maeher

Bekanntes Mitglied
Escorter hat gesagt.:
Aber ich denke ich blaib für mich dabei für jede Action einen eigenen ActionListener zu schreiben, denn dann ist es mir egal welcher Button die Action auslößt...
Geht natürlich wunderbar, nur erzeugst du damit jede Menge Hilfsklassen (auch wenn man nicht optimieren soll: Die kosten doch immer irgendwie Speicherplatz, bis zu mehreren 100Byte :lol: und machen meiner Meinung nach den Code mit den vielen Unterklassen unübersichtlicher als wenn man an einer Stelle sämtliche Events mit if-Abfragen beieinander hat).
Das ist wahrscheinlich Geschmackssache, die meisten automatischen GUI-Designer machen es übrigens wie du :lol: .
 

Escorter

Bekanntes Mitglied
GUI Designer sind doch scheiße, da kennt man seinen eigenen code nicht. Ne GUI von Hand schreiben ist nicht so schwer wie man denkt, wenn man sich etwas eingearbeitet hat.

Das mit dem Listenern ist, wie du schon gesagt hast, geschmacks Sache und naja der Speicherplatz... :)

Was mich noch interessieren würde was denn die performantere Lösung ist?

Gruß,
Esco
 
G

Guest

Gast
Action Command hat auch den Vorteil dass du die Knöpfe unterscheiden kannst,aber nur einen Listener pro Klasse brauchst
 
G

Guest

Gast
Hi, danke für die vielen Anregungen/Lösungen.

Habe nur eine Frage zur JAVA FAQ in dem Forum, warum erstellt man dort eine eigene Methode (private JPanel createButtonsPanel()) und schreibt das ganze nicht einfach in den Konstruktor?

Danke :D
 

Marco13

Top Contributor
Sowas wie
Code:
public Application()
{
    add(createControlPanel());
    add(createMainPanel());
}

private JPanel createControlPanel()
{
    JPanel controlPanel = new JPanel();
    controlPanel.add(createButtonPanel());
    controlPanel.add(createSliderPanel());
    controlPanel.add(createOptionsPanel());
    return controlPanel;
}

private JPanel createOptionsPanel()
{
    JPanel optionsPanel = new JPanel();
    optionsPanel .add(...);
    ...
    return optionsPanel;
}
...
ist doch deutlich übersichtlicher, aufgeräumter und leichter wartbar(!) als ein 5642-Zeilen-Konstruktor, wo man 56 ineinander verschachtelte Panels mit 324 Buttons und anonymen Listenern und 10 verschiedenen Layouts zusammenpfuscht..... Aber es geht natürlich beides... :roll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
D Regex greift nicht richtig Java Basics - Anfänger-Themen 4
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable Header ausgeblendete (width = 0) nicht per mouseDragged aufziehen. Java Basics - Anfänger-Themen 9
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
S Wie debugge ich dies am besten: SingleThreadExecutor führt Task nicht aus..? Java Basics - Anfänger-Themen 29
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
D MacOS: PDF erstellen geht nicht Java Basics - Anfänger-Themen 1
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
missy72 Erste Schritte (nicht) Deterministischer endlicher Automat Java Basics - Anfänger-Themen 9
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
P Netbeans installation geht nicht Java Basics - Anfänger-Themen 26
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
H Counter durch gepresste Taste nur auf 1 erhöhen und nicht durchzählen lassen Java Basics - Anfänger-Themen 7
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
T scanner nicht erkannt Java Basics - Anfänger-Themen 3
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
monsterherz if / else if mit Fehler den ich leider nicht finde Java Basics - Anfänger-Themen 11
D Jar Datei startet unter Linux nicht Java Basics - Anfänger-Themen 3
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
Darkherobrine9 Import klappt nicht Java Basics - Anfänger-Themen 7
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
_so_far_away_ Inventarisierungssystem brauche switch Cases und weiß nicht, wie ich e implementieren muss Java Basics - Anfänger-Themen 5
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
C Kann mir jemand sagen warum ich nicht mal rechnen kann ? Java Basics - Anfänger-Themen 32
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
K warum kann ich das Objekt nicht erstellen ? Java Basics - Anfänger-Themen 2
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
J Meine Mails gehen nicht raus Java Basics - Anfänger-Themen 8
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
S Ist JDK jetzt free oder nicht? Java Basics - Anfänger-Themen 5
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
D Eclipse will nicht auslesen Java Basics - Anfänger-Themen 6
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
TeacherMrSSimon Schachspiel, Werte in Figur eintragen klappt nicht Java Basics - Anfänger-Themen 23
B von Java/Eclipse verwendete Datei existiert gar nicht? Java Basics - Anfänger-Themen 6
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
M JButton setBackground() färbt nicht den ganzen Knopf Java Basics - Anfänger-Themen 4
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
F abbruch Exception lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
MarvinsDepression Umgebungsvariable kann Java-Applikationen außerhalb der IDE nicht starten Java Basics - Anfänger-Themen 4
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
H Kapselung protected aber in einer Kindklasse nicht zugänglich Java Basics - Anfänger-Themen 5
xaerez Threads Boolean Wert verändert sich nicht Java Basics - Anfänger-Themen 5
xaerez Threads Boolean Wert verändert sich nicht Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben