2016-05-01 17 views
0

Also ich Cardlayout in einem meinen Programmen bin mit und ich versuche, es zu machen, so dass, wenn Sie eine Taste, um die nächste Platte laden klicken. Ich habe eine panelHolder-Klasse, wo das Cardlayout gehalten wird und jedes Mal, wenn die Schaltfläche auf dem Panel gedrückt wird, würde es eine Methode in der panelHolder-Klasse aufrufen, die abhängig von der Schaltfläche eine bestimmte boolesche Variable auf true setzt und Repaint aufruft (wo die Panels sind) gezeigt). Aus irgendeinem Grund funktioniert mein Knopf nicht und ich kann nicht herausfinden, warum. Kann mir jemand helfen?Knopf in Cardlayout arbeitet nicht

import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import java.util.Arrays; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.swing.*; 

public class SheetReader101 extends JFrame { 
    public SheetReader101(){ 
     super("SheetReader101"); 
     setSize(2000,1000); 
     setLocation(0,0); 
     setResizable(true); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     PanelHolder pg2 = new PanelHolder(); 
     setContentPane(pg2); 
     setVisible(true); 
    } 
    public static void main(String[]args){ 
     SheetReader101 z1 = new SheetReader101(); 
    } 
} 
class PanelHolder extends JPanel { // HERE 
    CardLayout clayout = new CardLayout(); 
    PianoGameContent x; 
    tutorial y; 
    boolean [] paneldecide; 
    PanelHolder() { 
     super(); 
     y = new tutorial(); 
     x = new PianoGameContent(); 
     setLayout(clayout); 
     this.add("Tutorial", y); 
     this.add("FreePlay Mode", x); 
     paneldecide = new boolean[15]; 
    } 
     public static void main(String[]args){ 
      PanelHolder z1 = new PanelHolder(); 
      z1.run(); 
     } 
      public void run(){ 
      layoutShower(0); 
     } 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      } 
     public void layoutShower (int decide){ 
      { 
       PianoGameContent y2 = new PianoGameContent(); 
       PanelHolder.this.add("Piano", y2); 
       System.out.println("intro slide run"); 
       if(decide == 1){ 
        PanelHolder.this.add("Piano", y2); 
        System.out.println("testing11"); 
        clayout.show(PanelHolder.this,"Piano"); 
      } 
      } 
     } 
    } 
+1

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

+0

brauchen, reagiert die Schaltfläche auf die actionperformed-Methode? Oder es wurde eine Aktion für die Schaltfläche – DarkV1

+1

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

Antwort

2

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