actionPerformed und static?

  • Themenstarter Themenstarter FloRo
  • Beginndatum Beginndatum
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!
 
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!!!
 
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.
 
Vielen Dank!
Ihr seid echt schnell hier!
Ich werd das mal versuchen. Falls ich nicht klar komme melde ich mich wieder!
Danke, danke, danke!
 
Tut mir leid aber irgendwie komm ich nicht klar...
Kannst du mir evtl. ein Code-Beispiel geben???
Vielen Dank!
(Wie gesagt, Anfänger...)
 
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);
 
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... ;-)
 
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.");
   }
}
 
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();
    }
 
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();
    }
 
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.
 
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"));
   }
 
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!!!
 
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();
   }
}
 
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!!!
 
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:
 
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. 🙂
 
: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.

Zurück
Oben