定时显示JPanels

时间:2014-09-02 14:58:10

标签: java multithreading swing timer jpanel

我的桌面应用程序存在一个烦人的问题,我无法弄明白。我已将问题分离到以下示例中。我想做什么......

我有一个jframe和5个jpanel,每个面板都有不同的图片。启动时,用户将在我的jframe内部看到一个带有按钮的面板A.当按下按钮时,我希望面板A消失,面板B,C,D和E相互可见,但每个面板要显示不同的时间长度...... B可见3秒,B看不见,C可​​见5秒,C看不见......等等。

我已经尝试过javax.Timer,Thread.sleep(3000)甚至是语句,似乎没有达到我想要的效果。你们将如何实现这一目标以及我需要考虑的方法是什么?

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用Swing Timer听起来像是一种合理的方法。当用户单击JButton时,显示B并启动Timer,其间隔应为3秒。当Timer触发时,显示C并将Timer的间隔更改为5秒。当它再次触发时,显示C并设置你想要显示C的时间间隔。

如果不起作用,请发布MCVE来展示您尝试过的内容,我们将从那里开始。

答案 1 :(得分:-1)

这里我做了一个例子,显示:

  • 如何使用Swing计时器
  • 如何在JLabel上添加图像而不冻结程序
  • 借助计时阵列交换照片

Before

计时器启动后,它开始改变:

enter image description here

我的SSCCE:

     /**
     *
     * @author rohan
     */

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import javax.swing.*;

    public class TestSwapPics  {


    public TestSwapPics() {
        initComponents();
    }


    private void initComponents() {
        JFrame f =new JFrame();

        Panel = new javax.swing.JPanel();
        Panel.setLayout(new BorderLayout(5,5));
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setIcon(new ImageIcon(getClass().getResource("/images.jpg")));
        jButton1.setText("Start");

        Panel.add(jLabel1, BorderLayout.NORTH);
        Panel.add(jButton1, BorderLayout.SOUTH);
        f.add(Panel);
        f.pack();
        f.setVisible(true);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });


    }

      private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
      startPicsChange();
    }


    private void startPicsChange() {

        new Thread(new Runnable() {
            @Override
            public void run() {

                Timer t = createAndStartTimer(timings[count],count);

                while (t.isRunning()) {//wait for timer to be done
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
                     SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        count++;
                        if (count == timings.length) {
                            JOptionPane.showMessageDialog(null, "Done");

                        } else {
                            startPicsChange();
                        }
                    }
                });

            }
        }).start();
    }

    private Timer createAndStartTimer(int delay, final int count) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                if(count==0)
                 jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/p3.PNG")));
                if(count==1)
                 jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/p6.PNG")));
                System.out.println("yes! reached here");

            }
        });

        Timer t = new Timer(delay, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.out.println("here 2!!");
            }

        });
        t.setRepeats(false);
        t.start();
        return t;
    }


    public static void main(String args[]) {
          SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestSwapPics();
            }
        });
    }

    private JButton jButton1;
    private JLabel jLabel1;
    private JPanel Panel;
    private int[] timings = {2000, 1000, 4000,5000,2000};
    private int count=0;

    }