2017-08-26 5 views
0

Also habe ich dieses Spiel, das ich gerade angefangen habe zu machen und das erste Problem, das ich während der Herstellung des Spiels ist beim Ändern der Panels durch Karte Layout, wenn ich den Prozess es tun zeigt mir, dass es das Objekt instanziiert und es auch macht das Panel zu zeigen, aber auf visuelle gibt es keinen Effekt.Kartenlayout ändert nicht das Panel nach der Verarbeitung

Der Code ist wie folgt:

Original-Klasse

public class Parking_Mania { 

public static void main(String []args)throws Exception 
{ 
    new GameFrame("Paking Mania"); 
} 
} 

Das Spiel Rahmenklasse

public class GameFrame extends JFrame{ 

public GameFrame(String name) 
{ 
    this.setTitle(name); 
    this.setSize(640,510); 
    this.setLocationRelativeTo(null); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setResizable(false); 
    this.setVisible(true); 

    Frames frame=new Frames(); 
    this.add(frame); 
    frame.panel.show(frame, "opening"); 

} 
} 

Platte, die Frames

public class Frames extends JPanel{ 

CardLayout panel= new CardLayout(); 

public Frames() 
{ 
    this.setLayout(panel); 
    System.out.println("hello"); 
    Opening op=new Opening(); 
    nxtframe nf= new nxtframe(); 
    this.add(op, "opening"); 
    this.add(nf, "nt"); 
    } 

public void nxtf() 
{ 

    panel.show(this, "nt"); 
} 
} 

erste Platte ändert

public class Opening extends JPanel{ 



JButton but=new JButton(); 

public Opening(){ 

    this.setLayout(null); 
    this.setBackground(Color.BLACK); 
    add(but); 
    but.setText("next frame"); 
    but.setBounds(0, 0, 110, 120); 
    but.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      {     
       Frames f=new Frames(); 
       f.nxtf(); 
      } 
     }); 
} 

public void paint(Graphics g) 
{ 
    g.fillRect(110, 120, 110, 120); 
} 


} 

Second-Panel

public class nxtframe extends JPanel{ 

JButton but=new JButton(); 

public nxtframe(){ 

    System.out.println("hello"); 
    this.setLayout(null); 
    add(but); 
    but.setText("next frame"); 
    but.setBounds(0, 0, 110, 120); 
    but.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      { 

      } 
     }); 
} 

public void paint(Graphics g) 
{ 
    g.setColor(Color.BLUE); 
    g.fillOval(110, 120, 110, 120); 
} 


} 

PS: Ich habe nicht die Mühe das Hinzufügen von Kommentaren, wie ich es nehme selbsterklärend ist. Seien Sie versichert, wenn Sie mich brauchen, um die Kommentare hinzuzufügen, werde ich sie sofort hinzufügen.

+0

Bitte lesen Sie die Antworten zu beantworten. Fragen Sie nach irgendwelchen Fragen. –

+0

funktioniert ganz gut und gut Vielen Dank für Ihre Hilfe. –

Antwort

2

Denken Sie kritisch: Was denken Sie, was das bedeutet: new Frames(); innerhalb der ActionListener?

Antwort: es schafft einen NEW (Akzent auf dem Wort "neu") Objektrahmen. Neu, wie in völlig neu, verschieden und nicht verwandt mit dem Original. Das Ändern der Ansicht dieses Frames-Objekts hat keine Auswirkungen auf das aktuell angezeigte Frames-Objekt. Daher besteht die Lösung für Ihr Problem darin, * eine Referenz auf das tatsächlich angezeigte Objekt zu erhalten und Ihre Methode aufzurufen, die darauf befindliche Karten ändert.

Eine Lösung ist das sichtbar gemachte Frames Bezug in die Öffnung passieren, einen Konstruktor Paramter sagen durch zB

Opening op=new Opening(); 

ändern:

Opening op = new Opening(this); // pass in the current Frames reference 

Und dann in Öffnungs Konstruktor greifen, die Referenz und Verwenden Sie es:

public class Opening extends JPanel{ 
    private JButton but=new JButton(); 
    private Frames f; 

    public Opening(final Frames f){ 
     this.f = f; 
     this.setLayout(null); // !!!! no don't do this!!! 
     this.setBackground(Color.BLACK); 
     add(but); 
     but.setText("next frame"); 
     but.setBounds(0, 0, 110, 120); // and don't do this! 
     but.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // !!Frames f=new Frames(); 
       f.nxtf(); 
      } 
     }); 
    } 

    public void paint(Graphics g) { 
     g.fillRect(110, 120, 110, 120); 
    } 
} 

Andere nicht verwandte Probleme:

  • Verwenden Sie keine Null-Layouts. Wenn Sie sie verwenden, wird Ihre GUI steif, unflexibel und schwer zu warten und auf anderen Plattformen oft nicht funktionstüchtig.
  • Nicht überschreiben, sondern paintComponent, und rufen Sie die Super-Methode in der Überschreibung - lesen Sie das Tutorial zu diesem Lesson: Performing Custom Painting
+0

vielen Dank, die mir eine Menge Dinge erklärt haben.Der Grund, warum ich das Null-Layout behalte, ist, weil ich den Knopf in der bestimmten Position haben möchte, da ich ein Hintergrundbild von einem anderen Spiel verwenden werde und deshalb müsste ich meine Knöpfe entsprechend dem mir gelieferten Grafikbild ausrichten Wenn es einen anderen Weg gibt, kannst du mich bitte auch damit verlinken? PS: Du hast mir soo viele Male geholfen Dude ich schulde dir viel !!! Danke –

+0

Eine kurze Frage, wie ich ein Parkspiel mache, was würdest du mir vorschlagen, mit dem Auto zu machen, wäre es gut, wenn ich die Farbkomponente benutze oder würdest du mir vorschlagen, den klassischen JLabel als Auto zu benutzen und dann den j Etikett? –

Verwandte Themen