按钮点击后,Java JPanel似乎没有重新绘制

时间:2016-05-16 05:15:41

标签: java swing jpanel

我正在尝试使用按钮来基本上用另一个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);

}
}

1 个答案:

答案 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。

希望这有帮助