我正在尝试使用按钮来基本上用另一个JPanel替换JPanel。但是,当我运行下面的代码并单击窗口中的按钮时,它会显示一个空白屏幕而不是"说明"。我在revalidate()
方法之后调用了repaint()
和removeAll()
,正如其他人在其他论坛中所说的那样,我对窗口做的任何事情(即调整大小,最小化等)都没有&# 39;工作。
我确定我错过了一些愚蠢的东西,但我已经没有想法了。
感谢。
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);
}
}
Instructions类包含一个简单的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);
}
}
答案 0 :(得分:1)
这取决于你想要做什么。在我看来,你有两个选择。 您可以在JFrame中更改面板。您可以按照以下方式执行此操作:
jframe.remove(old_panel)
jframe.add(newPanel);
jframe.revalidate();
jframe.repaint();
第二个选项将更改面板内的内容,并将第二个面板添加为子面板。 执行以下操作:
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();
}
这里要注意的重要事项是thisPanel应该是由类设置的变量,并且不要在动作侦听器中使用“this”,因为动作侦听器中的“this”是指动作侦听器对象而不是JPanel
您需要使用for循环的原因是您不想删除刚刚添加的子面板。
如果你没有设置界限,你将看不到你的指令面板,因为它的大小为0。
希望这有帮助