gpt4 book ai didi

java - 动态更新 CardLayout 不起作用

转载 作者:行者123 更新时间:2023-12-02 00:04:07 25 4
gpt4 key购买 nike

我的代码使用卡片布局向用户显示(预定义的)带有 JButton 的 JPanel,然后显示动态生成的 JPanel 及其响应反馈,然后再继续下一个预定义的 JPanel。但是,我无法显示动态生成的 JPanel,并且使用 revalidate() 和 repaint() 等命令搞乱了一些,我不知道接下来要尝试什么。我可能犯了一个相当简单的错误,但是在尝试了很多组合之后,我有点陷入困境!

编辑:抱歉,这是我之前发布的一段非常无用的代码!我花时间写了一个更好的 SSCCE,它看起来确实与使用 Thread.sleep 有关,但我对此不太擅长,所以不太确定我需要做什么才能使其正常工作。这是我的例子:

public class ExampleClass implements ActionListener{

public void doStuff(){
ExampleClass ec = new ExampleClass();
startExperiment();

}

public static void main(String[] args){

ExampleClass e = new ExampleClass();
e.doStuff();
}


JPanel j;
int count = 0;
CardLayout cards = new CardLayout();
JButton button;

public void startExperiment(){

// Create frame and JFrames
JFrame trial = new JFrame();

trial.setSize(800,600);

JPanel j1 = new JPanel();
JPanel j2 = new JPanel();
j1.setSize(800,600);
button = new JButton("Click me!");
button.addActionListener(this);

j2.setSize(800,600);
j1.add(new JLabel("A Panel"));
j1.add(button);
j2.add(new JLabel("Another Panel"));
JPanel[] pans = {j1,j2};


j = new JPanel();
j.setLayout(cards);

for(int i=0;i<pans.length;i++){
j.add(pans[i], "Card"+i);
}

JPanel end = new JPanel();
end.add(new JLabel("The end!"));
j.add(end,"End");
trial.add(j);
trial.setVisible(true);
}



public void nextTrial(){

JPanel ps = new JPanel();
ps.add(new JLabel("This panel won't display!"));
j.add(ps,"Pause"+count);
cards.show(j,"Pause"+count);

}

class aThread extends Thread {
public aThread(int duration){
dur=duration;
}
int dur;
public void run() {
try {
Thread.sleep(dur);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void pause(int dur){
aThread myThread = new aThread(dur);
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}


}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button){
System.out.println("Ow!");
nextTrial();
pause(500);
cards.show(j,"Card1");
}

}

}

我意识到这与我大约 12 个月前在这里提出的问题类似 (http://stackoverflow.com/questions/9200072/jpanel-not-updating-cardlayout-properly-when-i-use-sleep ?rq=1),但我错误地认为使用Thread.join()可以解决我提到的问题。

最佳答案

添加通话

revalidate();
repaint();

向容器添加组件/从容器中删除组件后

关于java - 动态更新 CardLayout 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14219540/

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