2016-05-16 15 views
0

Ich versuche, eine Taste zu verwenden, um ein JPanel im Wesentlichen durch ein anderes JPanel zu ersetzen. Wenn ich jedoch den folgenden Code ausführe und auf die Schaltfläche im Fenster klicke, wird anstelle von "Anweisungen" ein leerer Bildschirm angezeigt. Ich habe revalidate() und repaint() nach der Methode removeAll() aufgerufen, wie andere Leute in anderen Foren angegeben haben, und alles, was ich mit dem Fenster mache (d. H. Größenänderung, Minimierung usw.) funktioniert nicht.Java JPanel scheint nicht nach dem Klicken neu zu streichen

Ich bin mir sicher, dass es etwas Dummes ist, dass ich vermisse, aber mir sind die Ideen ausgegangen.

Danke.

public class TitlePage extends JPanel{ 

private static final long serialVersionUID = 0; 
private JButton a; 
//The code works without me needing to define an extra JPanel instance variable. 

public TitlePage(){ 

    setLayout(null); 
    setBackground(Color.WHITE); 

    JLabel title = new JLabel("2009 AP(R) Computer Science A Diagnostic Exam"); 
    title.setBounds(175,100,650,50); 
    title.setFont(new Font("Times New Roman", Font.PLAIN, 30)); 
    setVisible(true); 
    add(title); 


    a = new JButton("Start Diagnostic"); 
    a.setBounds(400, 300, 200, 50); 
    a.setForeground(Color.BLUE); 
    a.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      removeAll(); 
      revalidate(); 
      repaint(); 
      add(new Instructions()); 
      revalidate(); 
      repaint(); 

     } 
    }); 
    setVisible(true); 
    add(a); 

    JLabel disclaimer = new JLabel("*AP(R) is a registered trademark of the College Board, which was not involved in the production of, and does not endorse, this product."); 
    disclaimer.setBounds(150,650,750,50); 
    disclaimer.setFont(new Font("Times New Roman", Font.PLAIN, 12)); 
    setVisible(true); 
    add(disclaimer); 

} 

} 

Die Klasse Instructions enthält ein einfaches JLabel.

public class Instructions extends JPanel { 

private static final long serialVersionUID = 0; 

public Instructions(){ 

    JLabel instr = new JLabel("Instructions"); 
    instr.setBounds(0,0,100,50); 
    instr.setForeground(Color.BLACK); 
    instr.setFont(new Font("Times New Roman", Font.PLAIN, 30)); 
    setVisible(true); 
    add(instr); 

} 
} 
+1

1) Für eine bessere Hilfe früher hilft 0.

Hoffnung sein, Posten [MCVE] oder [Kurz , Eigenständiges, korrektes Beispiel] (http://www.sscce.org/). 2) Java-GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgrößen, Bildschirmauflösungen usw. mit verschiedenen PLAFs in verschiedenen Locales arbeiten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). –

+0

Sie ersetzen das 'TitlePage'-Panel nicht durch das' Instructions'-Panel. Sie entfernen tatsächlich alle Komponenten von 'TitlePage' und fügen' 'TitlePage'' das' Instructions'-Panel hinzu. Ich denke, das Problem sind die Grenzen, die Sie auf diese Panels gesetzt haben. Ich denke, 'Instructions' wird außerhalb des sichtbaren Teils Ihres Frames angezeigt. Vermeiden Sie die Verwendung von "Null" -Layouts und Positionierungskomponenten, indem Sie ihre Grenzen festlegen. – Titus

+0

Ich denke, Sie müssen CardLayout verwenden, anstatt das Panel zu entfernen und hinzuzufügen. CardLayout wird das Zeug für Sie tun. Warum rufen Sie 'setVisible (true);' nach jedem 'add()' auf, das Sie nach dem Hinzufügen aller ui-Komponenten zum Container aufrufen können. – Beniton

Antwort

1

Es hängt davon ab, was Sie versuchen zu tun. Wie ich es sehe, haben Sie zwei Möglichkeiten. Sie können das Panel innerhalb des JFrame ändern. Sie können sehr einfach wie folgt vorgehen:

jframe.remove(old_panel) 
jframe.add(newPanel); 
jframe.revalidate(); 
jframe.repaint(); 

Optionen Nummer zwei würde den Inhalt innerhalb der Platte und das Hinzufügen der zweiten Platte als Sub-Panel werden zu ändern. Sie folgendermaßen vorgehen:

JPanel thisPanel = this; 
a.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    for(Component c: thisPanel.getComponents()) { 
     thisPanel.remove(c); 
    } 
    JPanel instruction = new Instruction(); 
    instruction.setBounds(your_values_here...); 
    thisPanel.add(instruction); 
    thisPanel.revalidate(); 
    thisPanel.repaint(); 
} 

Wichtige Dinge hier zu bemerken, dass thisPanel eine Variable von der Klasse gesetzt sein sollte, und verwenden Sie nicht ‚dies‘ innerhalb der Aktion Zuhörer, wie die ‚this‘ in der Aktion Hörer verweist zum Action-Listener-Objekt und nicht zum JPanel.

Der Grund für die Verwendung der for-Schleife besteht darin, dass Sie das gerade hinzugefügte Unterfenster nicht entfernen möchten.

Wenn Sie sehen Sie Ihre Anweisung Panel wird nicht nicht Grenzen gesetzt, wie es Größe dieses

+0

Das macht Sinn. Ich kann sehen, warum das implizierte "this" im ActionListener unangemessen ist. Ich werde deinen Vorschlag versuchen. –

+0

Ich habe Ihre 2. Lösung versucht, aber es hat nicht funktioniert. –

+0

Ich habe es erneut versucht, und dieses Mal hat es funktioniert. Vielen Dank! –

Verwandte Themen