我想展示如何使用JFrame
直观地进行合并排序。我想要做的是使后续JLabel
可见一段时间延迟。我尝试了很多方法,但所有这些都出现在同一时刻,没有中间延迟。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
// jLabel1.setVisible(false);
jLabel2.setVisible(false);
jLabel3.setVisible(false);
jLabel4.setVisible(false);
jLabel5.setVisible(false);
jLabel6.setVisible(false);
jLabel7.setVisible(false);
final Timer t=new Timer((4000), null);
final int delay=2000;
final ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setVisible(true);
t.getDelay();
jLabel2.setVisible(true);
t.setDelay(3000);
jLabel3.setVisible(true);
t.setDelay(2000);
jLabel4.setVisible(true);
t.setDelay(2000);
jLabel5.setVisible(true);
t.setDelay(2000);
jLabel6.setVisible(true);
t.setDelay(2000);
}
};
new Timer(delay, taskPerformer).start();
但是当我点击按钮时,所有的标签出现在同一个momenet上,虽然我一直拖延。
答案 0 :(得分:3)
您需要更新计时器动作监听器中的图标,如图here所示。您可以实现Icon
界面来渲染大小与元素比较值成比例的图标,如here所示。
附录:你可以稍微具体一点吗?
您希望设置以某些初始随机顺序对List<Number>
大小N
进行排序的中间步骤的动画。 Number
个子类实现Comparable<T>
,因此compareTo()
已经完成。 GridLayout(1, 0)
JLabel
每个Icon
都可以用[0, N)
来显示值。 DecRenderer
显示了如何创建比例大小的图标;你想要在{{1}}的间隔内改变高度。 GrayIcons
&amp; Mad的example显示了如何以某种顺序为图标的显示设置动画。
答案 1 :(得分:2)
为什么这不起作用有很多原因。首先,javax.swing.Timer
不能以这种方式工作。它会在后台等待,直到给定的延迟过去,然后调用已注册的ActionListener
s actionPerformed
方法。
其次,如果它以这种方式工作,它将阻止事件调度线程,阻止它处理重绘请求。
我认为你会发现使用How to use Swing Timers。
public class BlinkOut {
public static void main(String[] args) {
new BlinkOut();
}
public BlinkOut() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel[] labels;
private int[] delays;
private Timer timer;
private int index;
public TestPane() {
setLayout(new GridLayout(0, 1));
labels = new JLabel[7];
for (int index = 0; index < 7; index++) {
labels[index] = new JLabel("Label " + (index + 1));
add(labels[index]);
}
delays = new int[] {2000, 3000, 2000, 2000, 2000, 2000, 2000};
JButton hide = new JButton("Hide");
add(hide);
hide.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Click");
index = 0;
labels[index].setVisible(false);
timer.setDelay(delays[index]);
timer.start();
}
});
timer = new Timer(delays[0], new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Tick");
timer.stop();
index++;
if (index < 7) {
labels[index].setVisible(false);
timer.setDelay(delays[index]);
timer.start();
}
}
});
timer.setRepeats(false);
timer.setCoalesce(true);
}
}
}