I „vermuten“, dass das Kernproblem mit dem ursprünglichen Code zu tun hat Sie auf dem Laufenden, wo man die eine neue Instanz von PanelHolder
in Ihrem Kind Ansicht ActionListener
macht und dann versuchen, Ansichten zu wechseln, diesen neuen Instanz hat keine Beziehung zu der Instanz, die auf dem Bildschirm ist.
Es gibt ein paar Möglichkeiten, wie Sie CardLayout
verwalten können, meine bevorzugte Art ist es, eine Art "Navigations" -Controller zu verwenden, der definiert, wie die Navigation funktioniert, zB "next" und "previous" oder "back" , oder Sie können die tatsächlichen Ansichten definieren, die angezeigt werden können, dh showMenuView
, showTutorialView
usw., je nachdem, wie viel Kontrolle Sie möchten, dass Ihre Unteransichten geben.
Das folgende ist ein einfaches Beispiel, das die Grundidee zeigt, hat es ein enum
nutzt die verfügbaren Ansichten zu definieren (wie es mehr Sinn als 0
hat, 1
... und ich brauche nicht die tatsächlichen Namen zu erinnern, von die Ansichten kann die IDE automatisch für das richtige bieten;))
ich erstellen und jede Ansicht hinzufügen vorne, wenn ich die PanelHolder
schaffen, gebe ich auch jeweils eine Instanz der NavigationController
betrachten, so können sie mit ihm interagieren
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class JavaApplication1013 {
public static void main(String[] args) {
new JavaApplication1013();
}
public JavaApplication1013() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new PanelHolder());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public enum View {
MENU,
TUTORIAL,
FREEPLAY;
}
public interface NavigationController {
public void showView(View view);
}
public class PanelHolder extends JPanel implements NavigationController {
private CardLayout cardLayout;
public PanelHolder() {
cardLayout = new CardLayout();
setLayout(cardLayout);
add(new MenuView(this), View.MENU.name());
add(new TutorialView(this), View.TUTORIAL.name());
add(new FreePlayView(this), View.FREEPLAY.name());
}
@Override
public void showView(View view) {
cardLayout.show(this, view.name());
}
}
public abstract class ViewPane extends JPanel {
private NavigationController controller;
public ViewPane(NavigationController controller) {
this.controller = controller;
}
public NavigationController getController() {
return controller;
}
protected void showView(View view) {
controller.showView(view);
}
}
public class MenuView extends ViewPane {
public MenuView(NavigationController controller) {
super(controller);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
JButton tut = new JButton("Tutorial");
JButton freePlay = new JButton("Free Play");
add(tut, gbc);
add(freePlay, gbc);
tut.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showView(View.TUTORIAL);
}
});
freePlay.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showView(View.FREEPLAY);
}
});
}
}
public class TutorialView extends ViewPane {
public TutorialView(NavigationController controller) {
super(controller);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
JButton menu = new JButton("Menu");
add(new JLabel("Tutorial"), gbc);
add(menu, gbc);
menu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showView(View.MENU);
}
});
}
}
public class FreePlayView extends ViewPane {
public FreePlayView(NavigationController controller) {
super(controller);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
JButton menu = new JButton("Menu");
add(new JLabel("Free Play"), gbc);
add(menu, gbc);
menu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showView(View.MENU);
}
});
}
}
}
Nehmen Sie einen näheren l ook bei How to Use CardLayout für weitere Details
Sie paintcomponent nicht auf diese Weise verwenden, ist dies nicht, wie Malerei getan werden sollte, oder wie funktioniert Cardlayout. Fügen Sie stattdessen alle Ihre Komponenten dem Panel hinzu und rufen Sie einfach CardLayout # show auf, wenn Sie – MadProgrammer
brauchen, reagiert die Schaltfläche auf die actionperformed-Methode? Oder es wurde eine Aktion für die Schaltfläche – DarkV1
nicht deklariert. In Ihrer Lernprogrammklasse erstellen Sie eine neue Instanz von PanelHolder, die keine Beziehung zu der Instanz auf dem Bildschirm hat. Im Allgemeinen ziehe ich einen Navigation-Controller haben, die ich mein Kind Ansichten passieren kann, was ihm kann sagen, wann sie ändern wollen, dann liegt es an den Controller zu entscheiden, wie die Änderung zu machen – MadProgrammer