actionPerformed und static?

Status
Nicht offen für weitere Antworten.
F

FloRo

Gast
Hallo!
Ich hab folgendes Problem:
In meinem Hauptprogramm benutze ich sehr viele JButtons. Bei einem Klick auf einen dieser Buttons öffnet sich der gleiche Dialog. Trotzdem müsste das Programm wissen, welcher Button in der Hauptklasse gedrückt wurde.
In der Klasse des Dialogs sieht das so aus:

Code:
public void actionPerformed (ActionEvent e) {
    if (e.getSource() == ok) {
        ***
    }

    else if (e.getSource() == abbrechen {
        dispose();
    }
*** Hier bräuchte ich nun eine weitere Unterteilung wie z.B.:
Code:
if (e.getSource() aus Hauptklasse ==  best. Button aus Hauptklasse)

Kann ich also im Dialog auf die actionPerformed Methode einer anderen Klasse zugreifen???

Ich hab versucht in der Hauptklasse die actionPerformed Methode als static zu definieren, was aber anscheinend nicht funktioniert. Ich kann doch nicht für mehr als 100 Buttons 100 Dialoge schreiben!!!

Ihr seid meine letzte Rettung! :bahnhof:
Vielen Dank!
 
F

FloRo

Gast
Vielen Dank für die schnelle Antwort!
Ich bin leider blutiger Anfänger! und weiss nicht wie man actionCommands setzt!
Kannst du das erklären?
Danke!!!
 

L-ectron-X

Gesperrter Benutzer
Es genügt genau ein einziger Dialog.
Diesem übergibst du per Konstruktor eine Referenz des geklickten Buttons, welche du dann in deinem Dialog auswerten kannst.
 
G

Gast

Gast
Vielen Dank!
Ihr seid echt schnell hier!
Ich werd das mal versuchen. Falls ich nicht klar komme melde ich mich wieder!
Danke, danke, danke!
 
F

FloRo

Gast
Tut mir leid aber irgendwie komm ich nicht klar...
Kannst du mir evtl. ein Code-Beispiel geben???
Vielen Dank!
(Wie gesagt, Anfänger...)
 

L-ectron-X

Gesperrter Benutzer
Code:
import javax.swing.*;

public class MyDialog extends JDialog {

   public MyDialog(JFrame parent, String title, boolean modal, JButton button) {
      super(parent, title, modal);
      setSize(400, 300);
      setLocationRelativeTo(parent);
      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      
      buttonClicked(button);
   }

   private void buttonClicked(JButton button) {
      //hier prüfen, welcher Button geklickt wurde und das Programm entsprechend fortführen
   }

}

Der Aufruf des Dialogs aus deinem JFrame heraus sieht dann so aus:
Code:
MyDialog dialog = new MyDialog(this, "Fenstertitel", true, (JButton)e.getSource());
dialog.setVisible(true);
 
F

FloRo

Gast
Danke is echt super!
Das Problem ist ich habe mehr als 100 Buttons...
Muss ich die alle angeben:
public MyDialog (JFrame parent, String title, boolean modal, ALLE BUTTONS???) {

Ist dann private void buttonClicked (JButton button) mein actionPerformed???

Danke! Sorry dass ich nerve... ;-)
 

L-ectron-X

Gesperrter Benutzer
Im zweiten Codestück wird die Quelle des Events der eben erstellten MyDialog-Instanz übergeben.
In Abhängigkeit des gedrückten Buttons wird hier also immer der richtige Button übergeben.
Dieses Codestück baust du in deiner actionPerformed()-Methode deines JFrames ein.

MyDialog nimmt neben der Referenz auf den Eigentümer (JFrame), einem Fenstertitel und dem Modalmodus auch eine Referenz auf den geklickten Button entgegen.
Diese Button-Referenz wird am Ende des Konstruktors von MyDialog beim Aufruf der Methode buttonClicked() übergeben, die nun bspw. die Auswertung oder Prüfung ausführen kann.

Ich habe den Code nochmal etwas erweitert, so dass du auch noch Ergebnisse im Dialog sehen kannst.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame implements ActionListener {
   private JButton abc, def, ghi, jkl;
   private MyDialog dialog;
  
   public TestFrame(String title) {
      super(title);
      setSize(400, 300);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      
      setLayout(new GridLayout(2, 0));

      abc = new JButton("ABC");
      abc.addActionListener(this);
      add(abc);
      
      def = new JButton("DEF");
      def.addActionListener(this);
      add(def);
      
      ghi = new JButton("GHI");
      ghi.addActionListener(this);
      add(ghi);
      
      jkl = new JButton("JKL");
      jkl.addActionListener(this);
      add(jkl);

      setVisible(true);
   }
   
   public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      if(source instanceof JButton) {
         dialog = new MyDialog(this, "MyDialog", true, (JButton)source);
         dialog.setVisible(true);
      }
   }

   public static void main( String[] args ) {
      new TestFrame("So, mal gucken... ;-)");
   }
}

Code:
import javax.swing.*;

public class MyDialog extends JDialog {
   private JLabel label;

   public MyDialog(JFrame parent, String title, boolean modal, JButton button) {
      super(parent, title, modal);
      setSize(400, 200);
      setLocationRelativeTo(parent);
      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      
      label = new JLabel();
      label.setHorizontalAlignment(SwingConstants.CENTER);
      add(label);

      buttonClicked(button);
   }

   private void buttonClicked(JButton button) {
      //hier prüfen, welcher Button geklickt wurde und das Programm entsprechend fortführen
      label.setText("Der Button mit der Aufschrift \""+button.getText()+"\" wurde geklickt.");
   }
}
 
F

FloRo

Gast
OK danke, aber ich denke ich wurde noch nicht verstanden.
Ich sag mal um was es geht:
Bei meinem Programm handelt es sich um ein Karten-Reservierungs-Programm. Die Sitze werden im Frame mit Buttons dargestellt. Wenn man auf einen Sitz, also auf einen Button klickt, dann soll sich ein Dialog öffnen, der den Titel der Aufführung, Tisch- u. Stuhlnummer und das Datum enthält. Außerdem ein JPanel mit den Buttons OK und Abbrechen.
Wie du gesagt hast lasse ich im Frame den Dialog folgendermaßen aufrufen:
Code:
public void actionPerformed (ActionEvent e) {
    Object quelle = e.getSource();
    if (quelle instanceof JButton) {
        KartenDialog kd = new KartenDialog (this, "Karten-Reservierung", true, (JButton) quelle);
    }
}
Ich denke aber das ist nicht das Problem, es geht um den Dialog, konkret:
Wenn OK im Dialog gedrück wird, dann soll auf dem Button, der zuvor gedrückt wurde, ein ImageIcon plaziert werden.
Wenn Abbrechen gedrückt wird, dann soll sich einfach der Dialog schließen.
Das sieht bei mir so aus im Dialog:
Code:
public void actionPerformed (ActionEvent e) {
    Object quelle = e.getSource();
    if (quelle == ok) {
        // Hier sollte der Dialog zusätzlich prüfen, welcher Button gedrückt wurde, also eine weitere if-Anweisung
        // z.B.: if ([u]e.getSorce aus JFrame[/u] == button1) {
        //             button1.setIcon (reserviert);            

        dispose();
    }
    else if (quelle == abbrechen) {
        dispose();
    }
 

Wildcard

Top Contributor
Es geht also nur darum auf den Button der die Action gestarted hat ein neues Icon zu setzen?
Das ist überhaupt kein Problem, da du dem JDialog mit 'quelle' ja schon eine Referenz auf den gedrückten Button übergibst.
Also einfach
Code:
public void actionPerformed (ActionEvent e) {
    Object quelle = e.getSource();
    if (quelle == ok) {
        this.source.setIcon(reserviert);   
    dispose();
    }
 
F

FloRo

Gast
Nein, so stimmt das nicht.
"quelle" bezieht sich ja auf das ok oder abbrechen des Dialogs.
Das Icon soll aber auf den Button gesetzt werden, der den Dialog auslöst.
 

L-ectron-X

Gesperrter Benutzer
Es spricht doch nichts dagegen das hier zu machen:
Code:
   private void buttonClicked(JButton button) { 
      //hier prüfen, welcher Button geklickt wurde und das Programm entsprechend fortführen 
      label.setText("Der Button mit der Aufschrift \""+button.getText()+"\" wurde geklickt."); 
      button.setIcon(new ImageIcon("bild.gif"));
   }
 
G

Guest

Gast
Das glaub ich dir ja, bloß fehlt mir das Wissen...
Wie kann ich prüfen, welcher Button geklickt wurde? Kannst du mir dazu ein Beispiel geben?
Mir is das ja schon peinlich, aber mit deinen kurzen Code-Schnipseln bin ich halt überfordert, sorry!

Versteh ich das jetzt richtig, ist actionPerformed davon völlig unabhängig?
Thx!!!
 

L-ectron-X

Gesperrter Benutzer
OK, ich habe dich (vermutlich) jetzt erst richtig verstanden, ich schreibe dir mal ein Beispiel.
Während das Programm läuft, brauchst du eine Internetverbindung, weil sich das Programm die Icons aus dem Internet läd.
Code:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;

public class TestFrame extends JFrame implements ActionListener {
   private JButton abc, def, ghi, jkl;
   private MyDialog dialog;
  
   public TestFrame(String title) {
      super(title);
      setSize(500, 300);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      
      setLayout(new GridLayout(2, 0));

      abc = new JButton("ABC");
      abc.addActionListener(this);
      add(abc);
      
      def = new JButton("DEF");
      def.addActionListener(this);
      add(def);
      
      ghi = new JButton("GHI");
      ghi.addActionListener(this);
      add(ghi);
      
      jkl = new JButton("JKL");
      jkl.addActionListener(this);
      add(jkl);

      setVisible(true);
   }
   
   public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      if(source instanceof JButton) {
         try {
            dialog = new MyDialog(this, "Reservierung", true, (JButton)source);
            dialog.setVisible(true);
         }
         catch(MalformedURLException ex) {
            JOptionPane.showMessageDialog(this,
            "Die Adresse für eine Ressource ist fehlerhaft!",
            "MalformedURLException",
            JOptionPane.ERROR_MESSAGE);
         }
      }
   }

   public static void main( String[] args ) {
      new TestFrame("Kartenverkauf");
   }
}

Code:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;

public class MyDialog extends JDialog implements ActionListener {
   private JLabel label;
   private JButton ok, cancel, button;
   private JPanel buttonPanel;

   public MyDialog(JFrame parent, String title, boolean modal, JButton button) throws MalformedURLException {
      super(parent, title, modal);
      this.button = button;
      
      setSize(400, 200);
      setLocationRelativeTo(parent);
      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      
      label = new JLabel("Die Karten werden auf den Tisch \""+button.getText()+"\" reserviert!");
      label.setHorizontalAlignment(SwingConstants.CENTER);
      add(label, BorderLayout.CENTER);
      
      ok = new JButton("OK", new ImageIcon(new URL("http://www.famfamfam.com/lab/icons/silk/icons/accept.png")));
      ok.addActionListener(this);
      
      cancel = new JButton("Abbrechen", new ImageIcon(new URL("http://www.famfamfam.com/lab/icons/silk/icons/cancel.png")));
      cancel.addActionListener(this);
      
      buttonPanel = new JPanel();
      buttonPanel.add(ok);
      buttonPanel.add(cancel);
      
      add(buttonPanel, BorderLayout.SOUTH);
   }
   
   public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      if(source == ok) {
         try {
            button.setIcon(new ImageIcon(new URL("http://www.famfamfam.com/lab/icons/silk/icons/flag_blue.png")));
            dispose();
         }
         catch(MalformedURLException ex) {
            JOptionPane.showMessageDialog(this,
            "Die Adresse für eine Ressource ist fehlerhaft!",
            "MalformedURLException",
            JOptionPane.ERROR_MESSAGE);
         }
      }

      else if(source == cancel)
         dispose();
   }
}
 
F

FloRo

Gast
Vielen Dank erstmal für deinen Code!!!
Ich kanns eigentlich gar nicht glauben, aber es funktioniert!!!!
Ich glaube es zumindest, dass es funktioniert. Morgen werd ichs mir genauer anschauen.
Ich verstehs zwar nicht, ich hätte mir das viel schwieriger vorgestellt, das heißt ich weiß nicht warums funktioniert, aber das ist mir jetzt ziemlich egal :)
Ich weiß gar nicht, wie ich dir danken kann L-ectron-X ...
Falls du noch Lust hast, kannst du mir evtl. den Zusammenhang erklären, muss aber nicht sein.
DANKE!!!
 
F

FloRo

Gast
Also ich versteh nicht, wie die actionPerformed Methode des Dialogs weiß, welcher Button im Frame geklickt wurde, konkret:
Warum reicht es, dem Dialog nur den JButton button zu übergeben. Woher weiß der Dialog, dass damit alle Buttons des Frame gemeint sind?
Du musst mir das nicht erklären, du hattest mit mir genug zu tun... :!: Wär aber trotzdem schön.
Vielen vielen Dank!
Flo
Junge oder Mädchen? :wink:
 

L-ectron-X

Gesperrter Benutzer
FloRo hat gesagt.:
Also ich versteh nicht, wie die actionPerformed Methode des Dialogs weiß, welcher Button im Frame geklickt wurde, konkret:
Sie weiß es nicht, weil sie damit gar nichts zu tun hat. Die actionPerformed()-Methode verarbeitet nur ActionEvents, die im Dialog durch die JButtons ok und cancel gefeuert werden.

FloRo hat gesagt.:
Warum reicht es, dem Dialog nur den JButton button zu übergeben. Woher weiß der Dialog, dass damit alle Buttons des Frame gemeint sind?
In der actionPerformed()-Methode im JFrame wird ermittelt ( e.getSource() ), welcher Button geklickt wurde und einer erzeugten Instanz des Dialogs die Referenz auf dieses Button-Objekt übergeben. Somit ist auch im Dialog bekannt, welcher Button geklickt wurde.

FloRo hat gesagt.:
Junge oder Mädchen? :wink:
Ein Mädchen. :)
 
F

FloRo

Gast
:applaus: Danke Danke Danke :applaus:
Danke dir für Alles!!! Es funktioniert wirklich :lol: Sorry dass ich gezweifelt habe :lol:
Ich hoffe ich darf wieder kommen, wenn ich mal wieder hängen bleibe...
Das Beste ist ich habs jetzt sogar verstanden!

[schild=1 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]DANKE[/schild]

Ach du könntest den Haken noch setzen, ich glaub das kann ich nicht.
Bye, Flö
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
G lastFocusedComponent in ActionPerformed AWT, Swing, JavaFX & SWT 4
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
K Event Handling Mit ActionPerformed und java.io arbeiten AWT, Swing, JavaFX & SWT 3
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
L ActionPerformed Variable übergeben AWT, Swing, JavaFX & SWT 3
J in actionPerformed() Koordinaten ändern AWT, Swing, JavaFX & SWT 9
C actionPerformed mit mehren Aktionen AWT, Swing, JavaFX & SWT 3
C Actionperformed funktioniert nicht AWT, Swing, JavaFX & SWT 13
H actionPerformed aufteilen AWT, Swing, JavaFX & SWT 12
G if-bedinung in actionperformed AWT, Swing, JavaFX & SWT 4
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
S AWT Java actionPerformed "Ok" Button AWT, Swing, JavaFX & SWT 4
V Labeltext ändert sich nicht in actionPerformed AWT, Swing, JavaFX & SWT 5
M actionPerformed() wird zu oft aufgerufen AWT, Swing, JavaFX & SWT 10
M Arbeiten mit actionPerformed(ActionEvent) oder Alternative AWT, Swing, JavaFX & SWT 7
M Swing Anfängerfrage: ActionPerformed AWT, Swing, JavaFX & SWT 3
B Swing NullPointerException bei actionPerformed() AWT, Swing, JavaFX & SWT 2
B actionPerformed Problem AWT, Swing, JavaFX & SWT 3
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
J Aus ActionPerformed ein Plugin starten AWT, Swing, JavaFX & SWT 4
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
S ActionPerformed Fehler... AWT, Swing, JavaFX & SWT 9
O Button (ActionPerformed) soll neues JFrame erzeugen AWT, Swing, JavaFX & SWT 8
J Action before actionPerformed! AWT, Swing, JavaFX & SWT 4
E ActionListener/actionPerformed() feuert nicht AWT, Swing, JavaFX & SWT 2
E AWT Implementierung einer Anweisung in Methode ActionPerformed AWT, Swing, JavaFX & SWT 2
B Komisches Problem mit actionPerformed() AWT, Swing, JavaFX & SWT 2
K Swing: 2 Buttons und actionPerformed AWT, Swing, JavaFX & SWT 4
B actionPerformed reagiert nicht auf das Canvas-objekt AWT, Swing, JavaFX & SWT 11
B Objekt in "actionPerformed" erzeugen und nutzen AWT, Swing, JavaFX & SWT 3
B Exceptions in actionPerformed() weiterleiten AWT, Swing, JavaFX & SWT 9
S Variablenübergabe bei actionPerformed funktioniet nicht? AWT, Swing, JavaFX & SWT 12
X actionPerformed in einer Klasse Buttons AWT, Swing, JavaFX & SWT 2
T public void actionPerformed(...) ist statisch?? AWT, Swing, JavaFX & SWT 6
M JavaFX Non-static method 'widthProperty()' cannot be referenced from a static context AWT, Swing, JavaFX & SWT 4
J Swing The serializable class FMFrame does not declare a static final serialVersionUID field of type long AWT, Swing, JavaFX & SWT 5
M Swing Public Static GUI für CRM / ERP AWT, Swing, JavaFX & SWT 6
P non-static variablen benutzen AWT, Swing, JavaFX & SWT 7
M Zugriff auf Variablen eines Objektes ohne sie auf static zu setzen AWT, Swing, JavaFX & SWT 9
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
Spin Innere Klasse : kein static? AWT, Swing, JavaFX & SWT 8
J serializable class GUI does not declare a static final s. AWT, Swing, JavaFX & SWT 2
G Probleme mit static Methoden in JFrame/JDialog AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen


Oben