gpt4 book ai didi

java - contentpane.removeAll 不会删除 JPanel

转载 作者:行者123 更新时间:2023-11-30 06:58:12 25 4
gpt4 key购买 nike

我有一个带有启动按钮的 JPanel,当按下该按钮时,它会通过 mainFrame 调用 Controller 中的 start() 函数

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource().equals(start)) {
System.out.println("hi");
try {
f.c.start();
} catch (KludgeException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}
}

start() 函数调用askQuesions() 函数,该函数循环处理问题,为问题创建一个问题面板并存储答案。

public void start() throws KludgeException{
System.out.println("start");
askQuestions();
ConductInference();
}

public void askQuestions() throws KludgeException {
QuestionsPanel qp = new QuestionsPanel(main);
for(data.containers.Question q : kludge.getQuestions()){
qp.addQuestion(q.getQuestion(), q.getType());
main.setPanel(qp);
synchronized(this){
while(!next){
try {
wait();
kludge.setSystemValue(q.getValueName(), v);
//System.out.println("waitOver");
} catch (InterruptedException e) {}
}
}
next = false;
//System.out.println("next question");
}
System.out.println("questions over;");
}

这是 mainFrame 中的一个函数,它是一个 JFrame,它设置必要的面板。

public void setPanel(JPanel p){
main.getContentPane().removeAll();
main.getContentPane().add(p);
main.validate();
System.out.println("all removed, added and validated");
}

我的问题是这样...当按下统计按钮时,程序卡在开始面板上并卡住。如果我跳过整个开始面板并告诉它直接进入问题,它就可以正常工作。但我仍然不希望它直接进入问题。由于某种原因,它可以在问题面板之间切换,但不能在 startPanel 和 QuestionPanels 之间切换。

最佳答案

您遇到了并发问题,并且正在 Swing 事件线程上调用长时间运行的代码,该问题将阻止该线程执行其重要工作,例如绘制 GUI 和与用户交互。解决方案是在后台线程(例如 SwingWorker 提供的线程)中执行长时间运行的代码。然后阅读 Swing 并发性: Lesson: Concurrency in Swing

<小时/>

好吧,我现在确信我最初的建议——使用后台线程——是错误的,相反,您使用 while 循环、同步块(synchronized block)和等待使代码变得过于复杂。是的,这些正在阻塞事件线程,是的,这会限制您的应用程序,使其卡住并完全无响应,但解决方案不是使用后台线程,而是您需要摆脱 while (true)循环、同步块(synchronized block)和 wait()调用并在其位置使用事件监听器和回调方法。其确切的接线将取决于我们还不知道的代码,但这就是这个问题的解决方案。例如,问题面板可以通知控制类问题已得到解答,以更改模型的状态,以便它继续处理下一个问题。然后模型发生变化,这可以通知 View 它必须更新自身并现在显示下一个问题。

旁注:

  • 您最好使用 CardLayout 来交换 View ,然后直接交换它们。该教程可以在这里找到:CardLayout tutorial .

  • 关于:main.setPanel(qp);
    您似乎正在将 QuestionPanel 重新添加到 for 循环中的 main 中。如果是这样,您只需添加一次。

关于java - contentpane.removeAll 不会删除 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41429411/

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