JPanel reagieren nicht auf ActionListener

Status
Nicht offen für weitere Antworten.

raptorrs

Aktives Mitglied
Moin Zusammen!

Als erstes: Ja, ich habe so ziemlich alles gelesen, was man so lesen kann zum Thema Event Handling,
habe auch 2 Wochen erfolglos probiert. Aber ich verstehe einfach nicht, wie so ein Event-Handling funktioniert.
Bitte helft mir auf die Sprünge!!

Zur Aufgabenstellung:

Ich habe einen StartFrame, der irgendwelche Panels darstellen soll.
Die Panels stammen alle von einem BasePanel ab. Auf dem BasePanel liegt ein ButtonPanel.
Je nachdem, welches Panel nun gerade aktiv ist, sollen mit Hilfe der Buttons natürlich unterschiedliche Funktionen generiert werden.

Es passiert aber rein gar nichts und ich weiss beim besten Willen nicht, warum nichts passiert.
Vielleicht ist jemand von Euch so nett und schaut sich meinen vereinfachten Code mal an.

Zuerst der StartFrame:

Code:
package rrs;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class StartFrame extends javax.swing.JFrame
{ 
  public static final StartFrame MAIN = new StartFrame();
  private int status;
  //
  private ButtonPanel buttonPanel;
  private javax.swing.JPanel panel;
  private String text1;
  private String text2;
 

  private StartFrame() 
  { 
    initComponents();
  }

  public void initComponents()
  { 
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setSize (1000,700);
    panel = new BasePanel();
    add (panel);
    showRightPanel(0);
  }

      public javax.swing.JPanel showRightPanel(int status)
      {
      if (status == 0)
    { 
      remove(panel);
      panel = new BasePanel();
      panel.setBounds (10,15, getWidth()-30, getHeight()-650);
      add (panel);
      validate ();
      repaint();
      setVisible (true);
    }
      else if (status==1)   
    {
      remove(panel);
      panel = new Panel1();
      panel.setBounds (10,15, getWidth()-30, getHeight()-650);
      add (panel);
      validate ();
      repaint();
      setVisible (true);   
    }
      else if (status==2)   
    {
      remove(panel);
      panel = new Panel2();
      panel.setBounds (10,15, getWidth()-30, getHeight()-650);
      add (panel);
      validate ();
      repaint();
      setVisible (true);   
    } 
      return panel;
      }

    public static void main(String[] args)      
    {     
          StartFrame main = StartFrame.MAIN;
          main.setVisible (true);
    }      
}

Dieses "public static final StartFrame MAIN" stammt noch aus meinen eigenen Versuchen. Damit konnte ich ansatzweise zumindest die Panels darstellen. (Ähnlich dem Problem ein paar Threads weiter unten.) Wenn es jedoch darum geht, auf Panel 1 oder 2 etwas anderes zu machen, als nur ein neues Panel darzustellen,
versagt diese Vorgehensweise völlig.

Das ButtonPanel:

Code:
package rrs;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.event.EventListenerList;

public class ButtonPanel extends javax.swing.JPanel  
{    
    public ButtonPanel(String text1, String text2)
    {   listeners = new EventListenerList();
        this.text1 = text1; 
        this.text2 = text2;
        setSize(1050, 100);
        initComponents(); 
    }
    
 
    private void initComponents() 
    {
        btn1 = new javax.swing.JButton();
        btn2 = new javax.swing.JButton();

        setLayout(new java.awt.GridLayout(1, 0));

        btn1.setText(text1);
        btn1.setPreferredSize(new java.awt.Dimension(150, 80));
        btn1.setActionCommand(text1);
        btn1.addActionListener(new java.awt.event.ActionListener() 
        {
            public void actionPerformed(java.awt.event.ActionEvent evt) 
            {   
                btn1ActionPerformed(evt);
            }
        });

        add(btn1);

        btn2.setText(text2);
        btn2.setActionCommand(text2);
        btn2.addActionListener(new java.awt.event.ActionListener() 
        {
            public void actionPerformed(java.awt.event.ActionEvent evt) 
            {
                btn2ActionPerformed(evt);
            }
        });
        add(btn2);
    }                  

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) 
    {                                             
        fireActionEvent(evt);
    }                                             

    private void btn2ActionPerformed(java.awt.event.ActionEvent evt) 
    {                                            
        fireActionEvent(evt);
    }                                                                                                                                

    private void fireActionEvent(ActionEvent evt) 
    {      
           ActionListener[] listenerList = listeners.getListeners(ActionListener.class);
        for (int i = listenerList.length-1; i>=0; --i) 
        {
            listenerList[i].actionPerformed(evt);
        }
        
    }
    
    public void addActionListener(ActionListener listener) 
    {
        listeners.add(ActionListener.class, listener);
    }
    
    public void removeActionListener(ActionListener listener) 
    {
        if (listeners != null) {
            listeners.remove(ActionListener.class, listener);
        }
    }
    ActionListener listener;
    EventListenerList listeners;                    
    private javax.swing.JButton btn2;
    private javax.swing.JButton btn1;
    private String text1;
    private String text2;
}

Das BasePanel:

Code:
package rrs;

import javax.swing.event.EventListenerList;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;

    public class BasePanel extends javax.swing.JPanel implements ActionListener
    { 
    private String text1;
    private String text2;
    private ButtonPanel bp;
    
    
    public BasePanel() 
  {         
    setPreferredSize(new java.awt.Dimension(950, 500));
    setBackground(new java.awt.Color(236, 250, 220));
    setBorder(javax.swing.BorderFactory.createTitledBorder("Base-Panel"));
    setLayout(new java.awt.BorderLayout());
    text1 = "Show Panel 1";
    text2 = "Show Panel 2";
    makePanel(text1, text2);
  }

    public void makePanel(String text1, String text2)
  { 
    ButtonPanel bp = new ButtonPanel(getText1(), getText2());
    setBackground(new java.awt.Color(236, 250, 220)); 
    bp.setSize (1050, 100);
    setLayout(new java.awt.BorderLayout());
    add(bp, java.awt.BorderLayout.SOUTH);
  }

    public String getText1 ()
  { 
    return text1;
  }

    public String getText2 ()
  {
    return text2;
  }
  
    public void actionPerformed(ActionEvent e) 
  {
        String actionCommand = e.getActionCommand();
        System.out.println("ActionEvent: " + actionCommand);
        if (actionCommand.equalsIgnoreCase(getText1()) {
            btn1Action();
        } else if (actionCommand.equalsIgnoreCase(getText2())) {
            btn2Action();
        } 
    }
  
    public void btn1Action()
  {
    StartFrame.MAIN.showRightPanel(1);
  }
  
    public void btn2Action()
  {
    StartFrame.MAIN.showRightPanel(2);
  }
}

Panel1 abgeleitet von BasePanel:

Code:
package rrs;

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

public class Panel1 extends BasePanel implements ActionListener
{
    
    public Panel1()
    {
        setBorder(javax.swing.BorderFactory.createTitledBorder("Panel 1"));
        this.makePanel ("PANEL1 BTN1", "PANEL1 BTN2");
    }

    public void actionPerformed(ActionEvent e) 
    {
        String actionCommand = e.getActionCommand();

        if (actionCommand.equalsIgnoreCase(getText1())) {
            System.out.println("Hier kommt jetzt die Panel1 BTN1-Action");
        } else if (actionCommand.equalsIgnoreCase(getText2())) {
            System.out.println("Hier kommt jetzt die Panel1 BTN2-Action");
        } 
        else
        {
        System.out.println("Hier triff gar nichts zu");
        }
    } 
    
    public void btn1Action()
  {
    System.out.println ("Button 1 in Panel 1 wurde geklickt");
  }
  
    public void btn2Action()
  {
    System.out.println ("Button 2 in Panel 1 wurde geklickt");
  }
}

Panel2 abgeleitet von BasePanel:

Code:
package rrs;

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

public class Panel2 extends BasePanel implements ActionListener
{


  public Panel2 ()
    { 
      setBorder(javax.swing.BorderFactory.createTitledBorder("Panel 2"));
      this.makePanel ("PANEL2 BTN1", "PANEL2 BTN2");
    }
    public void actionPerformed(ActionEvent e) 
    {
        
        String actionCommand = e.getActionCommand();
        if (actionCommand.equalsIgnoreCase(getText1())) {
            System.out.println("Hier kommt jetzt die PANEL2 BTN1-Action");
        } else if (actionCommand.equalsIgnoreCase(getText2())) {
            System.out.println("Hier kommt jetzt die PANEL2 BTN2-Action");
        } 
    }  
    
    public void btn1Action()
    {
    System.out.println ("Button 1 in Panel 2 wurde geklickt");
    }
  
    public void btn2Action()
  {
    System.out.println ("Button 2 in Panel 2 wurde geklickt");
  } 
}

Vielleicht ist ja auch die Art und Weise, wie ich die Events behandle, völlig falsch. Ich kanns halt einfach nicht beurteilen.

Danke für Eure Hilfe!
 

André Uhres

Top Contributor
Versuch's mal mit unabhängigen Panels, wo jeder seine eigenen Buttons hat.
Im Frame brauchst du ausserdem ein GUI Element um das gewünschte Panel auswählen zu können.
Statt mit remove/add geht's eleganter mit CardLayout (siehe tutorial von Sun).
 

raptorrs

Aktives Mitglied
Hallo Andre!

Ja, mit individuellen Panels (Jeweils mit eigenen Buttons) wäre das schon hinzukriegen.

Aber wo ich dieses schöne ButtonPanel schon mal habe, wollte ich es gerne überall einsetzen.

Lässt sich das überhaupt realisieren ,was ich da vorhabe??
 

André Uhres

Top Contributor
raptorrs hat gesagt.:
..Aber wo ich dieses schöne ButtonPanel schon mal habe, wollte ich es gerne überall einsetzen.
Lässt sich das überhaupt realisieren ,was ich da vorhabe??
Du könntest das ButtonPanel im SOUTH-Bereich vom JFrame einfügen
und die beiden Gamepanels im CardLayout vom CENTER-Bereich.
Beispiel: GameSample.jar (Quellcode im jar)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JPanel soll auf Veränderungen reagieren! Java Basics - Anfänger-Themen 6
richis-fragen Optisch JPanel BorderLayout vertikaler Rand dicker als horizontaler Rand Java Basics - Anfänger-Themen 4
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
J Ein mit UI-Designer erstelltes JPanel einblenden Java Basics - Anfänger-Themen 0
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
Zeppi JPanel responsive Grid Java Basics - Anfänger-Themen 0
J JPanel in JScrollPanel Java Basics - Anfänger-Themen 4
Elyt JPanel als HintergrundBild Java Basics - Anfänger-Themen 7
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
B Wie kann man an ein JPanel eine Scrollbar anheften? Java Basics - Anfänger-Themen 8
O Swing JPanel Java Basics - Anfänger-Themen 4
CptK Klassen JPanel nach Ablauf der Spielzeit neuladen Java Basics - Anfänger-Themen 2
S JPanel wird nicht angezeigt Java Basics - Anfänger-Themen 1
D Animation JPanel Java Basics - Anfänger-Themen 1
M JLabels "verrutschen" beim übergeben von JPanel Java Basics - Anfänger-Themen 2
D Auf angeklicktes JPanel zugreifen Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
D JPanel passt die Größe nicht an Java Basics - Anfänger-Themen 22
Y Webinhalt JPanel Java Basics - Anfänger-Themen 6
D Erste Schritte JPanel verschiebt Fenster via setVisible Java Basics - Anfänger-Themen 5
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
S JPanel variablenabhängig erstellen Java Basics - Anfänger-Themen 13
J Methoden Dinge auf einem JPanel paltzieren Java Basics - Anfänger-Themen 1
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
A altes JPanel entfernen und neues öffnen Java Basics - Anfänger-Themen 5
I A0-Format in jpanel anzeigen Java Basics - Anfänger-Themen 1
R NullPointerException wegen JPanel oder doch nicht ? Java Basics - Anfänger-Themen 7
J Probleme mit eigenem JPanel (IDE Eclipse) Java Basics - Anfänger-Themen 4
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
V jab ich eclipse verrückt gemacht :D ? array Jpanel, Jlabel Grafik Fehler / Frage Java Basics - Anfänger-Themen 5
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
I Problem mit JPanel Java Basics - Anfänger-Themen 0
B JPanel ändert die Hintergrundfarbe nicht Java Basics - Anfänger-Themen 2
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
C JPanel in MessageDialog Java Basics - Anfänger-Themen 1
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Inhalt von JPanel erst nach Resize sichtbar Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
gamebreiti Methoden JPanel nach clearAll() und add neu zeichnen Java Basics - Anfänger-Themen 1
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
Z JPanel bleibt leer Java Basics - Anfänger-Themen 2
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
Q JPanel Java Basics - Anfänger-Themen 2
K Erste Schritte jpanel in einer klasse auslagern Java Basics - Anfänger-Themen 3
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
N String auf JPanel bewegen Java Basics - Anfänger-Themen 6
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
B JPanel -JTable Java Basics - Anfänger-Themen 2
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
L zoomen aus jpanel Java Basics - Anfänger-Themen 7
P Bekomme in meinen JPanel nur eine JComponente angezeigt Java Basics - Anfänger-Themen 7
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
R JFrame über einen JPanel Java Basics - Anfänger-Themen 5
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
F JPanel zu klein Java Basics - Anfänger-Themen 5
D GUI - Objekte in JPanel nach oben schieben Java Basics - Anfänger-Themen 2
S JPanel wird nicht eingefügt Java Basics - Anfänger-Themen 3
P Netbeans Platform - JLabel und JPanel setLocation Problem Java Basics - Anfänger-Themen 2
Kenan89 JPanel mit JTable Java Basics - Anfänger-Themen 9
I JPanel in JPanel Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
J Auf einem JPanel ein JFrame platzieren Java Basics - Anfänger-Themen 10
S JPanel anzeige Java Basics - Anfänger-Themen 2
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
T Zugreifen auf JPanel Java Basics - Anfänger-Themen 4
K JPanel auslagern Java Basics - Anfänger-Themen 9
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
T Tastendruck simulieren in JPanel Java Basics - Anfänger-Themen 3
P JPanel in JTable einfügen Java Basics - Anfänger-Themen 23
E Erste Schritte Objekte werden in JPanel angedockt und maximiert Java Basics - Anfänger-Themen 7
M Componenten auf JPanel anzeigen Java Basics - Anfänger-Themen 2
F JPanel als JPG - weisse Fläche Java Basics - Anfänger-Themen 9
L Image laden und auf jPanel ausgeben Java Basics - Anfänger-Themen 7
M JLabel auf JPanel positionieren Java Basics - Anfänger-Themen 8
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
D JPanel + ein JLabel Java Basics - Anfänger-Themen 8
B JPanel-Oberfläche speichern Java Basics - Anfänger-Themen 9
X JTable in JPanel in JTabbedPane mouseevent von jtable kommt nicht durch Java Basics - Anfänger-Themen 3
P GUI, JPanel Java Basics - Anfänger-Themen 7
H JPanel in andere Klasse übergeben Java Basics - Anfänger-Themen 7
D Grösse eines JPanel hinsichtlich LayoutManager festlegen Java Basics - Anfänger-Themen 4
B JPanel über anderem JPanel Java Basics - Anfänger-Themen 6
F zeichnen in JPanel Java Basics - Anfänger-Themen 7
F Unterschied JPanel und JFrame Java Basics - Anfänger-Themen 5
U JPanel dynamisch gestalten Java Basics - Anfänger-Themen 7
H Zeichnen in JPanel Java Basics - Anfänger-Themen 8
K Auf JPanel Zeichnen Java Basics - Anfänger-Themen 8
C jPanel im jPanel verändern Java Basics - Anfänger-Themen 15
B JPanel nachträglich verändern Java Basics - Anfänger-Themen 20
C JPanel erhält sporadisch keinen Fokus Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben