2016-03-28 16 views
-3

Ich brauche Hilfe mit einem Applet, das ich für meine Kursarbeit mache.Kartenlayout mit verschiedenen Klassen

Ich benutze Kartenlayout und ich möchte den Inhalt jeder Karte aus verschiedenen Klassen genommen werden. Dann möchte ich in jeder Karte Tasten zu anderen Karten wechseln. Ich habe Beispiele gesehen, die auf ähnliche Weise funktionieren, aber sie basieren auf JFrame und nicht auf Applet.

Bitte senden Sie mir keine externen Links, ich habe schon seit einigen Tagen Kartenlayout untersucht. Ich bin ein Java Anfänger und ich bin ein langsamer Lerner. Ich möchte, dass jemand mir ein einfaches Beispiel zeigt und erklärt, wie es gemacht wird. Vielen Dank!

public class MainClass extends JApplet implements ActionListener { 

     boolean inAnApplet = true; 
     JButton btn1, btn2; 
     JPanel cards; 
     final static String PANEL1 = ""; 
     final static String PANEL2 = ""; 


     public MainClass() { 

      Container contentPane = getContentPane(); 
      JPanel cbp = new JPanel();   
      cbp.add(new JLabel ("Hello world!")); 

      contentPane.add(cbp, BorderLayout.NORTH); 
      cards = new JPanel(); 
      cards.setLayout(new CardLayout());  


      JPanel p1 = new JPanel(); 
      p1.add(new JLabel("First panel!")); 
      btn1 = new JButton("Text panel"); 
      btn1.addActionListener(this); 
      p1.add(btn1); 


      JPanel p2 = new JPanel(); 
      p2.add(new JLabel("Second panel!")); 
      btn2 = new JButton("Button panel"); 
      btn2.addActionListener(this); 
      p2.add(btn2); 

      cards.add(p1, PANEL1); 
      cards.add(p2, PANEL2); 
      contentPane.add(cards, BorderLayout.CENTER); 


     } 

     public void init(){} 

     public void actionPerformed(ActionEvent evt) { 

      CardLayout cl = (CardLayout)(cards.getLayout()); 

       if(evt.getSource() == btn1) 
       { 
        cl.show(cards, PANEL1); 
       } 
       else if(evt.getSource() == btn2) 
       { 
        cl.show(cards, PANEL2); 
       } 
      } 
    } 
+1

'ich jemand möchte anzeigen möchten wissen müssen, um zu zeigen, Ich habe ein einfaches Beispiel und erkläre, wie es gemacht wird. "- Lesen Sie den Abschnitt aus dem Swing-Tutorial zu [How to Use CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) für funktionierender Demo-Code. Laden Sie den Code herunter und spielen Sie damit. Wenn Sie etwas über den Tutorial-Code wissen, können Sie uns eine bestimmte Frage stellen. Wir können nicht erraten, was Sie nicht verstehen. Zum Beispiel haben die Kartennamen im Tutorial tatsächlich einen Wert, nicht den leeren String. – camickr

+0

Vielen Dank für Ihren Kommentar. Ich habe dieses Tutorial mehrmals gelesen. Der Code, den ich angegeben habe, stammt aus diesem Tutorial. Ich verstehe, wie Kartenlayout funktioniert, ich weiß einfach nicht, wie man jede Karte (Panel) zu einer anderen Klasse macht. – darijus

Antwort

2

Der Code, den ich angegeben habe, ist buchstäblich aus diesem Tutorial entnommen.

Warum haben Ihre PANEL1- und PANEL2-Variablen keine Werte? Wie können Sie erwarten, dass es funktioniert, wenn Sie den Namen der Karte nicht angeben ??? Wie können Sie erwarten, dass etwas funktioniert, wenn Sie keinen Arbeitscode kopieren? Warum sollten wir Arbeitscode bereitstellen, wenn Sie den Code aus dem Lernprogramm nicht einmal befolgen können? Warum denken Sie, dass der von uns bereitgestellte Code anders sein wird?

aber ich verstehe nicht, wie man jede Karte zu einer anderen Klasse macht.

Es gibt keinen Unterschied. Wenn Sie eine Karte anzeigen möchten, müssen Sie den Namen der Karte kennen, die Sie anzeigen möchten.

Gerade jetzt Sie verwenden:

JPanel p1 = new JPanel(); 
cards.add(p1, PANEL1); 

Also, wenn die Platte in einer anderen Klasse ist dann der Code wäre:

JPanel p1 = new SomeCustomPanel() 
cards.add(p1, PANEL1); 

Wenn Sie in einem separaten Panel den gesamten Code wollen Sie dann muss den Layout-Manager aus dem übergeordneten übergeordneten Bedienfeld abrufen, damit der Code im ActionListener jedes Bedienfelds ungefähr so ​​aussieht:

JPanel parent = childPanel.getParent(); 
CardLayout layout = (CardLayout)parent.getLayout(); 

Jetzt haben Sie Zugriff auf den Layout-Manager, so dass Sie die Karten wechseln können, vorausgesetzt, Sie kennen den Namen jeder Karte. Wie Sie jede Karte benennen und wie Sie den Kartennamen zuweisen, bleibt Ihnen überlassen.

Edit:

public class SomeCustomPanel extends JPanel 
{ 
    public SomeCustomPanel 
    { 
     add(new JLabel("I'm a JLabel")); 
     JButton button = new JButton("Switch Panel"); 
     add(button); 
     button.addActionListener(...); // add ActionListener to swap cards 
    } 
} 

Edit:

Nun, ich diese Namen verwendet, um zu versuchen eine Eltern/Kind-Beziehung zwischen Komponenten ausgestattet sind zu zeigen, wenn man die Komponenten zu einem Panel hinzuzufügen, oder eine Platte auf eine andere Platte.

Wenn Sie einen ActionListener verwenden, ist die Quelle des ActionEvent der JButton. Mit der Schaltfläche, die ActionEvent generiert hat, können Sie also die Eltern/Kind-Kette erneut aufrufen, bis Sie das Panel mit CardLayout gefunden haben.

So würde Ihr Code mehr wie:

JButton button = (JButton)e.getSource(); 
JPanel someCustomPanel = (JPanel)button.getParent(); 
JPanel cardLayoutPanel = (JPanel)someCustomPanel.getParent(); 
CardLayout layout = (CardLayout)cardLayoutPanel.getLayout(); 
layout.show(cardLayoutPanel, "..."); 

Nachdem Sie nun den Layout-Manager haben nur Sie den Namen der Karte, die Sie

+0

Beruhigen Sie sich, der Code, den ich zur Verfügung stellte, funktioniert gut. Wo kann ich meinen Code einfügen, damit ich meine Panels in verschiedene Klassen umwandeln kann? – darijus

+0

Der Code, den Sie zur Verfügung gestellt haben, funktioniert nicht gut aus dem Grund, den ich Ihnen gegeben habe. Sie erstellen eine neue Klasse. Das Erstellen von Klassen ist Java 101, also bin ich mir nicht sicher, wo die Verwirrung liegt. – camickr

+0

Vielen Dank für Ihre Antwort! Genau das habe ich gebraucht. – darijus

1

Sie haben den Layoutmanager eines JPanels als CardLayout festgelegt. Eine Karte kann also jede Klasse sein, die zu einem JPanel hinzugefügt werden kann - d. H. Jede Komponente oder Unterklasse der Komponente.

+0

Können Sie mir ein Beispiel geben? Zum Beispiel, wie kann ich dies verschieben: JPanel p1 = new JPanel(); p1.add (neues JLabel ("Erstes Panel!")); btn1 = new JButton ("Text panel"); btn1.addActionListener (dies); p1.add (btn1); In eine separate Klasse? – darijus