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. :)
 

Robat

Top Contributor
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 :p )


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:

Joose

Top Contributor
- 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 :p ... 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.
 

Vitreus

Mitglied
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))
         {
         }
    }
    }
 

Harry Kane

Top Contributor
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);
 

Viktim

Bekanntes Mitglied
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.
 

Vitreus

Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Methoden JButton und JLabel in einer Methode erstellen Java Basics - Anfänger-Themen 5
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
M JButton setBackground() färbt nicht den ganzen Knopf Java Basics - Anfänger-Themen 4
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
J Jbutton blinkt Java Basics - Anfänger-Themen 5
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
E JButton und JTextField Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb Icon von JButton ändern Java Basics - Anfänger-Themen 1
P JButton -Arrays Java Basics - Anfänger-Themen 4
A JButton in anderer Klasse bearbeiten. Java Basics - Anfänger-Themen 2
L Erste Schritte JButton reagiert nicht Java Basics - Anfänger-Themen 5
S Bild über JButton legen Java Basics - Anfänger-Themen 3
V Einem JButton anweisungen geben Java Basics - Anfänger-Themen 4
F Interface JButton von anderer Klasse hinzufügen Java Basics - Anfänger-Themen 2
J JButton macht was er will Java Basics - Anfänger-Themen 3
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
H JButton - Wechsel der Textfarbe alle 500ms Java Basics - Anfänger-Themen 10
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
N JButton anpassen Java Basics - Anfänger-Themen 3
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
F JButton [] mit Werten hinterlegen Java Basics - Anfänger-Themen 10
M Code um per jButton ein neues Fenster zu öffnen Java Basics - Anfänger-Themen 3
A weiter JButton Fehler Java Basics - Anfänger-Themen 3
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
S JCombobox und JButton verknüpfen Java Basics - Anfänger-Themen 6
V wie kann ich eine Schleife pausieren, bis ein Jbutton gedrückt wird ? Java Basics - Anfänger-Themen 17
N Erste Schritte JButton reagiert nur einmal. Java Basics - Anfänger-Themen 12
S JButton Java Basics - Anfänger-Themen 2
A Farben wechseln mit JButton Java Basics - Anfänger-Themen 2
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
A Labels Inner JButton Event Erstellbar? Java Basics - Anfänger-Themen 3
K JButton alles zurücksetzen Java Basics - Anfänger-Themen 1
U JButton: Beschriftung ueber Variable zuweisen Java Basics - Anfänger-Themen 6
S JButton erscheint erst bei Mouseover Java Basics - Anfänger-Themen 10
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S JDK installieren JButton BorderPoints?! Java Basics - Anfänger-Themen 7
E Problem mit erben von JButton Java Basics - Anfänger-Themen 7
J Bei Hinzufügen von JButton Programm langsam Java Basics - Anfänger-Themen 3
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
S Jbutton per Passworteingabe aktivieren Java Basics - Anfänger-Themen 2
G über JButton Action einen anderen Button verändern Java Basics - Anfänger-Themen 7
H JButton - Icon(.png) aus resources laden Java Basics - Anfänger-Themen 23
M Hintergrundbild für JButton Java Basics - Anfänger-Themen 6
A jbutton - icon linksbündig, text zentriert Java Basics - Anfänger-Themen 10
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
J Hilfe bei JButton Java Basics - Anfänger-Themen 6
A JButton[] und String[] in doppelter For-Schleife Java Basics - Anfänger-Themen 4
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
pg1337 JButton zuschneiden Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
D JButton Array setBackground Java Basics - Anfänger-Themen 2
F JButton wie selektierter JTabbebPane-Header Java Basics - Anfänger-Themen 7
G jButton bei Klick String +1 Java Basics - Anfänger-Themen 5
C OOP Java JButton mit Funktion belegen Java Basics - Anfänger-Themen 3
S JButton wird nicht angezeigt Java Basics - Anfänger-Themen 14
C JButton.getIcon() != null Java Basics - Anfänger-Themen 3
E JButton-Text wird in Schleife nicht geändert Java Basics - Anfänger-Themen 4
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
T JButton Text ändern Java Basics - Anfänger-Themen 4
L JButton erscheint nur mit pack() Java Basics - Anfänger-Themen 3
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
E JButton Hintergrund / Rahmen entfernen? Java Basics - Anfänger-Themen 4
L Bild auf einem JButton Java Basics - Anfänger-Themen 4
K JButton.setText Problem Java Basics - Anfänger-Themen 6
M JButton und DisabledIcon Java Basics - Anfänger-Themen 2
K jButton zur Laufzeit hinzufügen Java Basics - Anfänger-Themen 22
A GUI - JButton problem! Java Basics - Anfänger-Themen 5
M JButton selbst nachprogrammieren Java Basics - Anfänger-Themen 3
A JButton Textrahmen Java Basics - Anfänger-Themen 7
A Platzierung eines JButton Java Basics - Anfänger-Themen 4
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
E JButton klassenübergreifend nutzen? Java Basics - Anfänger-Themen 6
R Liste graphischer Objekte z.B. JButton dynamisch erstellen Java Basics - Anfänger-Themen 13
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
P JButton identifizieren Java Basics - Anfänger-Themen 8
K Funktion zu einem JButton hinzufügen Java Basics - Anfänger-Themen 27
D HTML Text von jButton disablen Java Basics - Anfänger-Themen 2
E Auf JButton in Arraylist zugreifen Java Basics - Anfänger-Themen 6
E Andere Form eines JButton Java Basics - Anfänger-Themen 17
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
B JButton Größe einstellen? Java Basics - Anfänger-Themen 3
E Zeilenumbruch in JButton mit Variable Java Basics - Anfänger-Themen 2
A JButton erscheint nicht (BlueJ) Java Basics - Anfänger-Themen 2
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
B JPanel über JButton umändern Java Basics - Anfänger-Themen 9
D JButton transparent bekommen? Java Basics - Anfänger-Themen 5
H JButton Unsichtbar Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
J Variable die bei JButton Clicks mitzählt Java Basics - Anfänger-Themen 9
Developer_X JButton removt sich selbst Java Basics - Anfänger-Themen 32

Ähnliche Java Themen

Neue Themen


Oben