重新绘制我的面板时遇到问题。我对动画的想法是用int []来填充数组。这是有效的部分。现在为它设置动画我接受数组并用数组中的int []填充变量int []。然后我调用重绘来重新绘制所有数字的图像。但直到最后一次重画才会重画。有想法的人吗? 我认为问题所在的两个班级。如下所示(代码可能是混乱的)。
我的想法是,我想按下按钮shellSort。我已按下此按钮,代码将通过for循环填充pannel中的整数数组。然后它应该重新绘制我的面板,它没有。
编辑:我认为我的问题是它永远不会离开for循环直到它完成。如何停止for循环来重新绘制我的面板?然后继续我离开的地方?
我在一个小例子中重建了我的问题 代码:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class Repainten {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
GUI g = new GUI();
}
}
public class GUI extends JFrame implements ActionListener{
private JButton button;
private Panel p;
private int[] henk = {10, 6, 4, 2, 3, 7, 9};
public GUI() {
this.setTitle("getallen");
this.setSize(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//this.setLayout(new FlowLayout());
button = new JButton("Button");
p = new Panel();
button.addActionListener(this);
JPanel northPanel = new JPanel();
northPanel.add(button);
JPanel centerPanel = new JPanel();
centerPanel.add(p);
add(northPanel, BorderLayout.NORTH);
add(centerPanel, BorderLayout.CENTER);
//add(button);
add(p);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
animeer();
}
}
public void animeer() {
for (final int a : henk) {
p.cijfer = a;
p.repaint();
}
}
}
public class Panel extends JPanel{
public int cijfer = 0;
public Panel(){
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font font = new Font("Algerian", Font.PLAIN, 100);
g.setFont(font);
System.out.println(cijfer);
g.drawString(Integer.toString(cijfer), 60,110);
}
}
答案 0 :(得分:2)
问题是repaint
已经过优化,因此快速连续多次调用该方法只会导致最后一次调用。解决方案是使用Swing Timer
Timer timer = new Timer(2000, new ActionListener() {
int index = 0;
@Override
public void actionPerformed(ActionEvent e) {
p.cijfer = henk[index];
index++;
p.repaint();
if (index == henk.length) {
Timer timer = (Timer) e.getSource();
timer.stop();
}
}
});
答案 1 :(得分:0)