我的桌面应用程序存在一个烦人的问题,我无法弄明白。我已将问题分离到以下示例中。我想做什么......
我有一个jframe和5个jpanel,每个面板都有不同的图片。启动时,用户将在我的jframe内部看到一个带有按钮的面板A.当按下按钮时,我希望面板A消失,面板B,C,D和E相互可见,但每个面板要显示不同的时间长度...... B可见3秒,B看不见,C可见5秒,C看不见......等等。
我已经尝试过javax.Timer,Thread.sleep(3000)甚至是语句,似乎没有达到我想要的效果。你们将如何实现这一目标以及我需要考虑的方法是什么?
提前致谢。
答案 0 :(得分:0)
使用Swing Timer听起来像是一种合理的方法。当用户单击JButton时,显示B并启动Timer,其间隔应为3秒。当Timer触发时,显示C并将Timer的间隔更改为5秒。当它再次触发时,显示C并设置你想要显示C的时间间隔。
如果不起作用,请发布MCVE来展示您尝试过的内容,我们将从那里开始。
答案 1 :(得分:-1)
这里我做了一个例子,显示:
Swing
计时器JLabel
上添加图像而不冻结程序
计时器启动后,它开始改变:
我的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;
}