JButton einer anderen Klasse übergeben?

Vitreus

Mitglied
Hallo,

Ich bin erlerne momentan Java und arbeite momentan an einer Ampel. Das Grundgerüst steht soweit. Ich habe in meiner Klasse "Fenster" einen Button erstellt und mit diesem Button möchte ich in der "Draw" weiterarbeiten. Wenn der Button gedrückt wurde, soll die Ampelschaltung beginnen und somit neu gezeichnet werden.

Wie bekomme ich es nun hin, das ich den Button von der Klasse "Fenster" in der Klasse "Draw" verwenden kann?

Hier ist mal der wichtige Teil des Codes:
Klasse Fenster:

Java:
package ampel;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Fenster extends JFrame{

    JButton Start;
    JFrame jFrame;

   
    public Fenster() {
        jFrame = new JFrame();
        Start = new JButton("Ampel starten!");
        Start.setBounds(200, 550, 400, 50);
        jFrame.setTitle("Ampel");
        jFrame.setSize(800,700);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(Start);
        jFrame.setVisible(true);
        }
    }

Klasse Draw:

Java:
package ampel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;

import Wecker.Gui;

public class Draw extends JPanel implements ActionListener{

private static final long serialVersionUID = 1L;

    protected void paintComponent(Graphics g){

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   
    // draw //
   
    // Rahmen //
    g.setColor(Color.GRAY);
    g.fillRect(300, 100, 180, 400);
    g.fillRect(365, 200, 50, 400);
   
    // Rot aus //
    Color Rotaus = new Color (255, 128, 128); 
    g.setColor(Rotaus);
    g.fillOval(340, 130, 100, 100);
   
    // Gelb aus //
    Color Gelbaus = new Color (255, 255, 136); 
    g.setColor(Gelbaus);
    g.fillOval(340, 250, 100, 100);
   
    // Grün aus //
    Color Gruenaus = new Color (128, 255, 128); 
    g.setColor(Gruenaus);
    g.fillOval(340, 370, 100, 100);       
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        }
       
    }

Wäre nett wenn mir jemand Helfen könnte und falls ich irgendwas graviernd falsch gemachte habe (Struktur etc), würde mich das auch interessieren. 🙂
 
Also erstmal 3 Dinge vorab:
-Du erweiterst deine Klasse mit JFrame und legst eine Variable vom Typ JFrame an. Du brauchst aber nur die Variable 🙂
- Klassennamen immer in UpperCammelCase und Variablen/Methodennamen immer in lowerCammelCase. Verwende Aussagekräftige Namen start-->buttonStart / btnStart
so weißt du gleich was die Variable macht/ist. Aus start kann man nicht viel ablesen 🙂
-Du solltest dein Programm immer nach MVC Schema (Model View Controller) aufbauen. Was das ist kannst du hier nachlesen 🙂


Nun zu deiner Frage:
Damit der Button auf deinem ActionListener reagiert musst du ihm sagen wo dein ActionListener ist. Das machst du mit:
Java:
button.addActionListener(..);
In Klammern kommt dann die Klasse, in der du den ActionListener implementiert hast. In deinem Fall also new Draw() . (Was sich sicherlich ändert wird nach dem du den Artikel zu MVC gelesen hast 😛 )


In deinem ActionListener kannst du dann prüfen, ob der Button der das Event auslöst auch wirklich dein StartButton ist

Java:
@Override
public void actionPerformed(ActionEvent e)
{
      if(e.getSource() == btnStart /*Name des Buttons */)
     {
           // do some cool stuff
     }
}

Gruß
Robert
 
Zuletzt bearbeitet von einem Moderator:
- Klassennamen immer in UpperCammelCase und Variablen/Methodennamen immer in lowerCammelCase. Verwende Aussagekräftige Namen start-->buttonStart / btnStart
so weißt du gleich was die Variable macht/ist. Aus start kann man nicht viel ablesen 🙂
buttonStart bzw. btnStart ist die ungarische Notation, welche auch nicht immer gerne gesehen wird.
Außerdem weiß man jetzt auch nur das es ein Button ist der etwas startet 😛 ... startSchaltung oder startAmpelanlage ist da noch aussagekräftiger und ob es ein Button ist oder etwas anderes ist dabei egal 😉 (vor allem wenn man die Komponente mal durch etwas anderes austauscht dann passt der Variablennamen nicht mehr dazu)

-Du solltest dein Programm immer nach MVC Schema (Model View Controller) aufbauen. Was das ist kannst du hier nachlesen 🙂
Nicht immer 😉 es gibt noch andere Variante nach denen man es aufbauen kann bzw. passt MVC nicht immer.
 
Hey,
Danke für die schnellen Antworten.

Meinst du mit erweiteren das extends JFrame?
Brauch ich das nicht unbedingt bzw ist es falsch, wenn ich das als zusatz hinzufüge?
Danke für die Tipps. Ich werde absofort versuchen meine Variablen und Angaben genauer zu beschreiben.
Ich habe mir auch zum MVC Schema einiges durchgelesen und auch ein Video dazu angeschaut. Es ist etwas abstrakt und daher nicht greifbar für mich. Also im View wird etwas angezeigt und dadurch kann der Benutzer etwas eingeben. Durch eine interaktion (z.b Buttondruck) wird es zum Controller weitergeleitet und durch denn gelangt es zum Model. Das enthält ja Daten und dieser werden durch den Controller abgefragt. Also gehen die Daten vom Model zurück zum View und werden dort angezeigt. Stimmt das so im groben? Auch frage ich mich, wie das MVC Model das mit dem "new Draw()" beeinflusst. Was ändert sich daran, wenn ich das MVC Model anwende?

Ich habe versucht deinen Code umzusetzen aber trotzdem funktioniert es nicht. Habe ich was vergessen oder woran liegt es?

Klasse Fenster:
Java:
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Fenster{

    JButton btnStart;
    JFrame jFrame;

  
    public Fenster() {
        jFrame = new JFrame();
        btnStart = new JButton("Ampel starten!");
        btnStart.setBounds(200, 550, 400, 50);
        btnStart.addActionListener(new Draw());
        jFrame.setTitle("Ampel");
        jFrame.setSize(800,700);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(btnStart);
        jFrame.add(new Draw());
        jFrame.setVisible(true);
        }
    }

Klasse Draw:
Code:
package ampel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;

import Wecker.Gui;

public class Draw extends JPanel implements ActionListener{

private static final long serialVersionUID = 1L;

    protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  
    // draw //
  
    // Rahmen //
    g.setColor(Color.GRAY);
    g.fillRect(300, 100, 180, 400);
    g.fillRect(365, 200, 50, 400);
  
    // Rot aus //
    Color Rotaus = new Color (255, 128, 128);
    g.setColor(Rotaus);
    g.fillOval(340, 130, 100, 100);
  
    // Gelb aus //
    Color Gelbaus = new Color (255, 255, 136);
    g.setColor(Gelbaus);
    g.fillOval(340, 250, 100, 100);
  
    // Grün aus //
    Color Gruenaus = new Color (128, 255, 128);
    g.setColor(Gruenaus);
    g.fillOval(340, 370, 100, 100);      
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
          if(e.getSource().equals(btnStart))
         {
         }
    }
    }
 
Du legst zwei Instanzen von Draw an. Eine ist der ActionListener, die andere fügst du dem JFrame hinzu.
Machs mal so:
Java:
Draw draw = new Draw();
btnStart.addActionListener(draw);
jFrame.add(draw);
 
Java:
@Override
    public void actionPerformed(ActionEvent e)
    {
          if(e.getSource().equals(btnStart))
         {
         }
    }
In dieser Methode musst du den Code reinschreiben, der ausgeführt werden soll, wenn der Button gedrückt ist.
das
Java:
if(e.getSource().equals(btnStart))
         {
         }
Brauchst du nicht, weil du ja mit
btnStart.addActionListener(new Draw());
den actionListener nur auf den Button und nichts anderes addest.

Du kannst da ja erstmal probeweise eine Konsolenausgabe reinschreiben, die dann kommt, wenn der Knopf gedrückt ist.
 
Danke für die Tipps.

Ich habe mich noch mal schlau gemacht und bin mitlerweile auch fertig mit der Ampel.
Den Button habe ich mir einfach über den Draw Konstruktor aufgerufen und dann so verwendet.
Ich schick es einfach mal der vollständigkeit halber hier rein.

Java:
package ampel;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Fenster{
    Draw draw;
    Schaltung Schaltung;
    static int ampelzeit = 0;
   
    JButton btnStart;
    JFrame jFrame;

   
    public Fenster() {
        jFrame = new JFrame();
        btnStart = new JButton("Ampel starten!");
        draw = new Draw(btnStart);
        btnStart.setBounds(200, 550, 400, 50);
        jFrame.setTitle("Ampel");
        jFrame.setSize(800,700);
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(btnStart);
        jFrame.add(draw);
        jFrame.setVisible(true);

Java:
package ampel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import Wecker.Gui;

public class Draw extends JPanel implements ActionListener{

private static final long serialVersionUID = 1L;

    private JButton btnStart;
    Graphics g;
    Timer schaltung;
    boolean an=false;

   
   
    public Draw(JButton btnStart) {
        an=false;
        this.btnStart = btnStart;
        btnStart.addActionListener(this);
       
        schaltung = new Timer();
        schaltung.scheduleAtFixedRate(new TimerTask() {
   
           
           
            public void run() {
            if(an)    {
                repaint();
                }
            }
    }, 5000, 5000);   
    }
   
    protected void paintComponent(Graphics g){
    this.g= g;
        super.paintComponent(g);
        an = false;
   
        if(!an){
            umschalten(false, false, false, g);
            }else {
                paint(g);
                  }
        System.out.println(an);
    }

    @Override
    public void actionPerformed(ActionEvent e){
          if(e.getSource().equals(btnStart)){
              an = true;
         }
    }

Der Code geht noch weiter aber der Rest ist/war nicht Relevant für mein Problem.
 

Neue Themen


Zurück
Oben