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) 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). –
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
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