2

私は画像を含む2つのjlabelsを持っています..もう一方がクリックされたときにラベルの画像を変更しようとしています..(ゲームなど)..問題があります..Thread.sleepを書き込むと、画像が表示されません変更..コードを参照してください:

public class Game extends JFrame{
private JLabel l1,l2;;
private boolean isClicked = false ,isClicked2 = false;
public Game(){
    setLayout(new FlowLayout());
    l1 = new JLabel(new ImageIcon(getClass().getResource("image1.png")));
    add(l1);
    l2 = new JLabel(new ImageIcon(getClass().getResource("image1.png")));
    add(l2);


    l1.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {}
        @Override
        public void mousePressed(MouseEvent e) {}
        @Override
        public void mouseReleased(MouseEvent e) {
            if(isClicked2){
                l1.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                try {
                    Thread.sleep(1000);
                    l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                    l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                    isClicked2 = false;
                    isClicked = false;
            }catch(InterruptedException ex){}
            }
            else{
                l1.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                isClicked = true;
            }     
        }@Override public void mouseEntered(MouseEvent e){}@Override public void mouseExited(MouseEvent e){}
    });

    l2.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {}
        @Override
        public void mousePressed(MouseEvent e) {}
        @Override
        public void mouseReleased(MouseEvent e) {
            if(isClicked){
              try {
                    l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                    Thread.sleep(1000);
                    l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                    l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                isClicked = false;
                    isClicked2 = false;
              }catch(InterruptedException ex){}  
            }
            else{
                l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                isClicked2 = true;
            }     
        }@Override public void mouseEntered(MouseEvent e){}@Override public void mouseExited(MouseEvent e){}
    });
}

public static void main(String[] args) {
    Game g = new Game();
    g.setTitle("Fint the same");
    g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    g.pack();
    g.setVisible(true);
}

}

それを実行し、最初のラベルをクリックします。

4

2 に答える 2

0

画像の変更は、イベント スレッド (グラフィック イベントの処理に使用されるスレッド) で行う必要があります。したがって、画像を設定すると、メソッドが返された後に処理される適切なイベントがキューに入れられます。ただし、その時点では、イベント スレッドでの sleep()ing によって他のイベントの処理が許可されないため、イメージは既に元に戻っています。dashrb が言ったように、メイン スレッドを sleep() しないで、タイマーでフリップ バックをスケジュールします。

                if (isClicked) {

                    l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));

                    new javax.swing.Timer(1000, new ActionListener() {
                        @Override
                        public void actionPerformed(final ActionEvent e) {
                            l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                            l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                            isClicked = false;
                            isClicked2 = false;
                        }
                    }).start();

                } catch (final Exception ex) {
                    ex.printStackTrace();
                }
            } else {
               ...
于 2012-12-11T16:44:04.047 に答える
0

これらのメソッドで sleep() を使用しないでください。これらのメソッドは、すべての描画イベントを処理する「イベント ディスパッチ」スレッドから呼び出されます。眠っている場合、スレッドはラベルを再描画できません。

スリープするのではなく、イメージを変更してから、必要に応じてイメージを再度変更するために今から 1 秒後に起動する javax.swing.Timer タスクを作成します。上記の koljaTM のサンプルは、「間違った」スレッドで実行される java.util.Timer を使用しています。これは彼のコードで、SWING タイマーを使用するように変更されています。

            if (isClicked) {
            try {
                l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                        System.out.println("image2 gone");
                        l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                        isClicked = false;
                        isClicked2 = false;
                    }
                });
                timer.setRepeats(false);
                timer.start();
            } catch (final Exception ex) {
                ex.printStackTrace();
            }
        } else {
           ...
于 2012-12-11T16:29:08.747 に答える