# Abfragen von Buttons in einem Panel einer anderen Klasse



## mabe (5. Feb 2004)

Hallo!

Da ich noch ein ziemlicher Anfänger in Sachen Java/Swing bin, mir meine Java-Bücher nicht weiterhelfen konnten und ich auch schon Stunden im Internet verbracht habe, um die Lösung zu finden, hoffe ich nun, dass ich hier die Antwort auf mein Problem finde.

Ich habe folgendes Problem:
Ich füge eine Klasse (JPanel) in mein "Programm" ein, auf dem sich zwei Buttons befinden. So weit, so gut. Doch wie kann ich nun aus meinem "Programm" prüfen, ob ein Button dieser Klasse gedrückt wurde.
(So wie in meinem beigefügten Quellcode sollte die Geschichte in etwa aussehen, nur möchte ich in der Klasse "Klassen" prüfen, ob ein Button gedrückt wurde, und nicht in der Klasse "Buttons")

Die "Buttons"-Klasse soll später eine eigene Datei werden, die universell verwendet werden kann

```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Klassen
  {
  static JFrame frame;
  static Buttons button;

  public static void main(String[] args)
    {
    frame = new JFrame("Mehrere Klassen");

    button = new Buttons();
      frame.getContentPane().add(button);

    frame.pack();
    frame.setSize(300,80);
    frame.setVisible(true);
    }

  /*In dieser Klasse ('Klassen') möchte ich prüfen,
    ob ein Button gedrückt wurde.
    Leider schaffe ich es nur in der 'Buttons'-Klasse.
    Ich könnte mir vorstellen, dass ich auch hier
    einen Listener definieren muss. Da 'button' aber
    ein JPanel und kein JButton ist, weiß ich nicht,
    was ich "lauschen" soll.

    Etwa so:
      wenn button1 oder button2 gedrückt:
        System.exit(0);
  */
  }


class Buttons extends JPanel
  {
  Buttons()
    {
    setLayout(new FlowLayout());
    JButton button1 = new JButton("Button 1");
    JButton button2 = new JButton("Button 2");
      add(button1);
      add(button2);

    button1.addActionListener(new ButtonLauscher());
    button2.addActionListener(new ButtonLauscher());
    }

  class ButtonLauscher implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
      {
       System.out.println(e.getActionCommand());
      }
    }
  }
```


----------



## bygones (5. Feb 2004)

warum willst du das unbedingt in der klasse "klassen" machen ?

Aber ich würde das dann so machen.


```
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class Klassen   { 
  static JFrame frame; 
  static Buttons button; 

  public static void main(String[] args)    { 
    frame = new JFrame("Mehrere Klassen"); 

    button = new Buttons(this); 
    frame.getContentPane().add(button); 

    frame.pack();  // packt langt schon, da set er dir automatisch die benötigte größe
    frame.setVisible(true); 
  } 
  
  public void doButton1() {
  };

  public void doButton2() {
  }
} 

class Buttons extends JPanel  implements ActionListener { 
  private Klassen klassen
  public Buttons(Klassen klassen)  { 
  this.klassen = klassen
  setLayout(new FlowLayout()); 
  JButton button1 = new JButton("Button 1"); 
  JButton button2 = new JButton("Button 2"); 
  add(button1); 
  add(button2); 

  button1.addActionListener(this); 
  button2.addActionListener(this); 
 } 
 
  public void actionPerformed(ActionEvent e)  { 
    if(e.getActionCommand().equals("Button 1"){
      klassen.doButton1();
    }
    else {
      klassen.doButton2();
   }
  } 
 } 
}
```

aber ehrlich - für diese Anwendung halte ich eine extra Klasse "Buttons" für überflüssig. Wenn du in der Klasse "Klassen" einfach das JPanel so einfügst (also JPanel buttonPanel = new JPanel()....) - dann hast du auch nicht das Problem mit dem Übergeben


----------



## mabe (9. Feb 2004)

Hallo!

Der Grund, warum ich es aus "Klassen" abfragen möchte ist, dass durch einen Klick auf einen der Buttons in der Klasse "Klassen" etwas ausgeführt wird.

Ich werde mir deinen Vorschlag mal ansehen. Erstmals danke für die schnelle Antwort

mfg

Matthias


----------



## mabe (10. Feb 2004)

Hi!

Der Grund, warum nur zwei Buttons in der Klasse sind, liegt nur daran, dass ich das Beispiel für das Forum klein halten wollte. In meinem Programm sind viel mehr Elemente in dem Panel. Deshalb wollte ich es später in eine andere Datei auslagern und dann importieren, damit der Quellcode nicht zu lang wird.

So in etwa war es auch gemeint. Ich habe den Quellcode nun etwas umgeschrieben. Nur weiß ich nicht, was ich an Buttons übergeben muss. Wenn ich "this" übergebe, bekomme ich folgende Fehlermeldung:

Klassen.java:14: non-static variable this cannot be referenced from a static context
    button = new Buttons(this);
                         ^
1 error


Hier noch mal der geänderte Code:


```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Klassen
  {
  static JFrame frame;
  static Buttons button;

  public static void main(String[] args)
    {
    frame = new JFrame("Mehrere Klassen");

    button = new Buttons(this);
      frame.getContentPane().add(button);

    frame.pack();
    frame.setVisible(true);
    }
  }


class Buttons extends JPanel
  {
  private Klassen klassen;
  public Buttons(Klassen klassen) {
  this.klassen = klassen;

    setLayout(new FlowLayout());

    JButton button1 = new JButton("Button 1");
      button1.addActionListener(
        new ActionListener () {
          public void actionPerformed( ActionEvent e ) {
            System.out.println(e.getActionCommand());
          }
        } );

    JButton button2 = new JButton("Button 2");
      button2.addActionListener(
        new ActionListener () {
          public void actionPerformed( ActionEvent e ) {
            System.out.println(e.getActionCommand());
          }
        } );

      add(button1);
      add(button2);
    }
  }
```


----------



## bygones (10. Feb 2004)

du musst natürlich erst eine Instanz der Klasse erstellen !


```
Klassen k = new Klassen();
button = new Button(k);
```


----------

