2016-05-18 17 views
0

Ich bin also neu in der Programmierung und habe ein Programm erstellt, das mehrere JPanels auf einem JFrame und anderen JPanels verwendet. Ich verwende CardLayout, um zwischen verschiedenen JPanels zu wechseln, und ich arbeite an zwei verschiedenen JButtons, aber ich kann nicht die letzte zum Hauptbildschirm zurückkehren lassen.JButton, der bei Verwendung von CardLayout nicht zwischen Karten wechselt

Ich habe nach Antworten gesucht, aber es scheint, als ob die meisten Leute einfach vergessen, einen ActionListener zu benutzen, etwas, von dem ich weiß, dass ich es gemacht habe. Hier sind einige der beteiligten Klassen in meinem Code (Es gibt eine Menge, also werde ich sie nicht alle einschließen, aber ich kann alle anderen zur Verfügung stellen, die benötigt werden).

Hier ist die JFrame Klasse:

import javax.swing.*; 

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.*; 

public class ElephantCare extends JFrame { 
private static final long serialVersionUID = 1L; 

private final String MAIN_STRING = "Main"; 
public JPanel container, main; 
private Staff1Panel staff1 = new Staff1Panel(); 
private Staff2Panel staff2 = new Staff2Panel(); 
private StaffConfirmPanel staffConfirm = new StaffConfirmPanel(); 
private WelcomePanel welcome = new WelcomePanel(); 
private StaffPanel staff = new StaffPanel(); 
private GallonsPanel gallons = new GallonsPanel(); 
private ToysPanel toys= new ToysPanel(); 
private ActionPanel action = new ActionPanel(); 
public CardLayout card = new CardLayout(); 

public ElephantCare() { 
    setSize(400,300); 
    setTitle("Elephant Care"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    buildPanel(); 
    add(container); 
    setVisible(true); 
} 

private void buildPanel() { 
    main = new JPanel();; 
    container = new JPanel(card); 
    container.add(main, MAIN_STRING); 
    container.add(staff1, "Staff 1"); 
    container.add(staff2, "Staff 2"); 

    main.setLayout(new BorderLayout()); 

    main.add(welcome, BorderLayout.NORTH); 
    main.add(staff, BorderLayout.WEST); 
    main.add(gallons, BorderLayout.CENTER); 
    main.add(toys, BorderLayout.EAST); 
    main.add(action, BorderLayout.SOUTH); 

    staff.getStaff1Button().addActionListener(new Staff1Listener()); 
    staff.getStaff2Button().addActionListener(new Staff2Listener()); 
    staffConfirm.getConfirmButton().addActionListener(new ConfirmButtonListener()); 
} 

private class Staff1Listener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     card.show(container, "Staff 1"); 
    } 
} 

private class Staff2Listener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     card.show(container, "Staff 2"); 
    } 
} 
private class ConfirmButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     card.show(container, MAIN_STRING); 
    } 
} 

}

Hier ist die JPanel mit dem Button:

import javax.swing.*; 

public class StaffConfirmPanel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    public JButton confirm; 

    public StaffConfirmPanel() { 

     confirm = new JButton("OK"); 

     add(confirm); 
    } 

    public JButton getConfirmButton() { 
     return confirm; 
    } 
} 

Und hier ist die JPanels, wo die Schaltfläche verwendet wird:

import java.awt.BorderLayout; 

import javax.swing.*; 

public class Staff1Panel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    private Staff1NamePanel name = new Staff1NamePanel(); 
    private Staff1JobPanel job = new Staff1JobPanel(); 
    private StaffConfirmPanel confirm = new StaffConfirmPanel(); 

    public Staff1Panel() { 
     setLayout(new BorderLayout()); 

     add(name, BorderLayout.WEST); 
     add(job, BorderLayout.EAST); 
     add(confirm, BorderLayout.SOUTH); 
    } 
} 

Und:

import java.awt.BorderLayout; 

import javax.swing.*; 

public class Staff2Panel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    private Staff2NamePanel name = new Staff2NamePanel(); 
    private Staff2JobPanel job = new Staff2JobPanel(); 
    private StaffConfirmPanel confirm = new StaffConfirmPanel(); 

    public Staff2Panel() { 
     setLayout(new BorderLayout()); 

     add(name, BorderLayout.WEST); 
     add(job, BorderLayout.EAST); 
     add(confirm, BorderLayout.SOUTH); 
    } 
} 

Vielen Dank für jede Hilfe!

Antwort

2

Es gibt viele Dinge in diesem Code, die nicht ganz richtig sind, und sie tragen zu Ihrem Problem bei. Lassen Sie uns also das größte Problem angehen und dann müssen Sie den Rest selbst erledigen.

Zuerst bearbeiten Code einige Debug Text haben:

private class ConfirmButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     //NEW LINE OF CODE 
     System.out.println("ConfirmButtonListener was triggered"); 
     card.show(container, MAIN_STRING); 
    } 
} 

Nun, wenn Sie Ihren Code ausführen, werden Sie feststellen, dass die Meldung „ConfirmButtonListener ausgelöst wurde“ wird nie auf der Konsole ausgegeben werden, dass der Code mit der Bedeutung läuft nie, so dass Sie nie zum Hauptbildschirm zurückkehren können.

Dies geschieht, weil Sie in Ihrer ElephantCare Klasse einen StaffConfirmPanel mit dem Namen staffConfirm erstellen. Dann fügen Sie einen Aktionslistener zu staffConfirm hinzu. Das Problem ist, dass Sie nie das Panel staffconfirm irgendwo verwenden, weil Sie ein neues StaffConfirmPanel innerhalb Staff1Panel und Staff2Panel erstellen, so dass der Aktion Listener, den Sie gemacht haben, nichts tun wird.

So ist die Lösung die gesamte ConfirmButtonListener-Methode und die staffConfirm.getConfirmButton().addActionListener Linie in die StaffConfirmPanel Klasse wie so zu bewegen:

import javax.swing.*; 

public class StaffConfirmPanel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    public JButton confirm; 

    public StaffConfirmPanel() { 

     confirm = new JButton("OK"); 

     add(confirm); 

     //NEW LINE: SET THE ACTION LISTENER 
     confirm.addActionListener(new ConfirmButtonListener()); 
    } 

    public JButton getConfirmButton() { 
     return confirm; 
    } 

    //NEW CODE, MOVE THE ACTION LISTENER METHOD HERE 
    //ACTION LISTENER MOVED HERE 
    private class ConfirmButtonListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      //NEW LINE OF CODE 
      System.out.println("ConfirmButtonListener was triggered"); 
      card.show(ElephantCare.container, ElephantCare.MAIN_STRING); 
     } 
    } 
} 

Jetzt sollte es funktionieren richtig und zurück zum Hauptbildschirm.

EDIT: Sie müssen MAIN_STRING eine öffentliche Variable in der ElephantCare Klasse machen.