2016-06-24 4 views
1

Ich bin ziemlich neu in GUIs und habe Probleme mit dieser Aufgabe. Grundsätzlich haben wir insgesamt acht Klassen und müssen drei Panel-Klassen auf drei verschiedene Arten verwenden: Eine Methode verwendet nur die Klassen TopPanel und InitialPanel, eine Klasse nur die BottomPanel-Klasse und die InitialPanel-Klasse und eine Klasse nur die InitialPanel-Klasse. Das Ziel besteht darin, eine Schaltfläche im unteren Bereich anzuzeigen, die Informationen über einen Fußballspieler anzeigt, wenn der Knopf im oberen Bedienfeld gedrückt wird. `So verwenden Sie den Aktionslistener auf einer Schaltfläche in einer anderen Klasse

public class BottomPanel extends JPanel implements ActionListener 
{ 
    public JButton b1; 
    public BottomPanel(final JPanel topPanel) 
    { 
     super(); 
     setBackground(Color.pink); 
     //setLayout(new GridLayout(3,1)); 
     b1 = new JButton("When the user clicks on the button in the UPPER panel, displays the football player's position here"); 

     add(b1); 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     Object obj = event.getSource(); 
     if(obj == b1) 
     { 
      b1.setText(fp1.getPosition()); 
     } 
    } 




} 



public class InitialPanel extends JPanel 
{ 
    public InitialPanel() 
{ 
    super(); 
    setBackground(Color.gray); 
    setLayout(new BorderLayout()); 

    TopPanel p1 = new TopPanel(); 
    add(p1,"North"); 

    BottomPanel p2 = new BottomPanel(p1); 
    add(p2,"Center"); 




} 


}` 

public class TopPanel extends JPanel 
{ 
    public TopPanel() 
    { 
     super(); 
     setBackground(Color.yellow);   
     footballPlayer fp1 = new footballPlayer("Mark","Allen",22, "IST", 5.6f, 180, "Junior","Running Back"); 
     // the whatsUp of this student has to shown in the other panel  
     JButton jl1 = new JButton(fp1.getInfo()); 
     add(jl1); 
    } 
}` 

Ich glaube, ich erhielt die einzige TopPanel und InitialPanel läuft, aber auf mich fest, was für die anderen beiden zu tun. Außerdem ist getInfo() die Methode, die aufgerufen wird, wenn der Text der unteren Taste gesetzt wird, und wir können KEIN anderes footballplayer Objekt erstellen als das, das in TopPanel verwendet wird. Jede Hilfe wird geschätzt!

Antwort

1

Sie haben die jl1 Schaltfläche bereits zur TopPanel hinzugefügt, jetzt sollten Sie einen Listener zu dieser Schaltfläche hinzufügen: Sie können ihn in der Klasse BottomPanel hinzufügen.

Sie erhalten einen Verweis auf topPanel im BottomPanel Konstruktor, so dass Sie ihn als Mitglied und erstellen Sie den Hörer, so etwas wie dieses halten:

public class BottomPanel extends JPanel implements ActionListener 
{ 
    public JButton b1; 

    /** added member to topPanel **/ 
    private JPanel mTopPanel; 

    public BottomPanel(final JPanel topPanel) 
    { 
     super(); 
     setBackground(Color.pink); 

     this.mTopPanel = topPanel; 

     b1 = new JButton("When the user clicks on the button in the UPPER    
     panel, displays the football player's position here"); 

     add(b1); 

     /** the topPanel jli button listener **/ 
     this.mTopPanel.jl1.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       /** edit your button with the info of the player **/ 
       b1.setText("player info added here"); 
      } 
     }); 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     Object obj = event.getSource(); 
     if(obj == b1) 
     { 
      b1.setText(fp1.getPosition()); 
     } 
    } 
} 
+0

Vielen Dank! Bis auf eine Sache sieht alles gut aus, die Objekte von TopPanel werden immer noch nicht erkannt. Gibt es eine Möglichkeit, mTopPanel mit der TopPanel-Klasse zu verbinden? – Steve

+0

Wie ist nicht zu erkennen? Wenn der BottomPanel-Konstruktor das obere Bedienfeld als Parameter erhält? –

+0

Ich bin nicht wirklich sicher, wie verbindet sich finales JPanel topPanel mit der TopPanel-Klasse? Ich denke, das ist das Problem – Steve

1

Sie sollten die Bodenplatte als Listener der Schaltfläche registrieren im oberen Bereich. Um dies zu erreichen, sollten Sie in der Klasse TopPanel eine Liste mit allen Listenern anlegen. Sobald die Taste gedrückt wird, werden die Informationen des aktuellen Spielers an alle Zuhörer gesendet. Und was Sie tun müssen, ist ButtonPanel Klasse implementieren die Listener, die ich hier DisplayPlayerInfoListener nennen.

Irgendwo in Ihrem Code müssen Sie das untere Feld als Listener zum oberen Bedienfeld hinzufügen. Möglicherweise müssen ausgestrahlt werden, um andere UI-Komponenten sowie

topPanel.addDisplayPlayerInfoListener(bottomPanel); 

Auf diese Weise können Sie so viele Zuhörer registrieren, wie Sie, da diese Informationen abrufen möchten. Außerdem trennt es die beiden Panels. Sie müssen die Informationen nicht abrufen, indem Sie auf eines der anderen Panels-Felder für Methoden zugreifen. Die Informationen werden verarbeitet, wenn sie versandbereit sind. Das TopPanel sieht das BottomPanel nur als DisplayPlayerInfoListener-Instanz, daher ist die Kopplung geringer.