0

私のコードでは、Card Layout を使用して JButton を含む (事前定義された) JPanel をユーザーに表示し、動的に生成された JPanel を応答に関するフィードバックとともに表示してから、次の事前定義された JPanel に進みます。しかし、動的に生成された JPanels を表示することができず、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() を使用すると、私が言及した問題を解決できると誤って信じていました。

4

3 に答える 3

2

通話を追加

revalidate();
repaint();

コンポーネントをコンテナに追加/コンテナから削除した後

于 2013-01-08T16:36:15.533 に答える
1

「revalidate()やrepaint()などのコマンドを少しいじった」場合は、

pause(500);

Thread.sleep()と関係があるので、問題になる可能性があります。

絵をブロックし、すぐに次のカードを表示します。

確かに、前述のように、コンパイル可能なプログラムのサンプルを投稿してください。

于 2013-01-08T22:52:48.960 に答える
0

私を正しい方向に向けてくれた、答えてくれたすべての人に感謝します。結局、スレッドと同期性についての理解が不十分であることが関係していることがわかりました。他の誰かが同様の問題を抱えている場合は、コードの最後のビットを次のように変更することでこれを解決しました。

public void actionPerformed(ActionEvent e) {
    if(e.getSource()==button){

         nextTrial();

        SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  pause(500);
                  cards.show(j,"Card1");

                }
              });
    }
}
于 2013-01-09T01:55:52.583 に答える