gpt4 book ai didi

单击按钮后 Java JPanel 似乎不会重新绘制

转载 作者:行者123 更新时间:2023-12-01 09:55:41 24 4
gpt4 key购买 nike

我正在尝试使用一个按钮将 JPanel 本质上替换为另一个 JPanel。但是,当我运行下面的代码并单击窗口中的按钮时,它显示一个空白屏幕而不是“说明”。正如其他人在其他论坛中所说的那样,我在 removeAll() 方法之后调用了 revalidate()repaint() ,以及我所做的任何事情对窗口执行的操作(即调整大小、最小化等)不起作用。

我确信我错过了一些愚蠢的东西,但我已经没有想法了。

谢谢。

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);

}
}

最佳答案

这取决于您想要做什么。在我看来,你有两个选择。您可以更改 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。

希望这有帮助

关于单击按钮后 Java JPanel 似乎不会重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37247121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com