[英]Slowing Down Program's execution to show steps
我有一个运行用于解决难题的基本算法的程序。 我正在尝试减慢速度,以便用户可以看到实际的算法。 我希望程序显示解决难题所需的步骤。 我尝试使用计时器,甚至使用thread.sleep尝试减慢速度。 但是,我的GUI(JPanel)不在delay语句之前或之后重新绘制。 发生的是延迟的发生,并且算法正在逐步解决,但是程序GUI并未更新/重新绘制以显示步骤。 这是该部分的代码:
delay(System.currentTimeMillis(), 500);
repaint();
延迟部分都很好。 谁能告诉我为什么JPanel不重新粉刷?
这是我制作的延迟方法:
public static void delay (long a, int x) //Simple Delay Method
{
while((System.currentTimeMillis()-a) < (x/10)){}
}
您不能只休眠UI线程并等待重绘发生,这将在这段时间内停止所有用户和操作系统的交互(包括重绘事件)。 从重绘文档 :
如果此组件是轻型组件,则此方法将导致尽快调用此组件的paint方法。
尽快并不意味着立即开始 ,它很可能会安排重新绘制,该重新绘制将在ui线程释放时运行。
您必须更改算法以将其状态保留在对象中,并使其能够逐步执行,并使用此答案中的计时器 。
例:
public class SwingMain extends JFrame {
public class MyPanel extends JPanel {
public String state = "Initial";
private JButton btn_start;
public MyPanel() {
super();
btn_start = new JButton("Start");
add(btn_start);
btn_start.addActionListener(e -> doSolve());
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(getFont());
g.drawString(state, 10, 20);
};
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
}
private List<String> states;
private int stateIndex;
protected Task token;
private MyPanel pnl_main;
public SwingMain() {
super("Step by step");
setupUi();
}
protected void setupUi() {
pnl_main = new MyPanel();
getContentPane().add(pnl_main);
}
private List<String> modelSolve() {
return Arrays.asList("First", "Second", "Third", "Fourth", "Fifth");
}
public void doSolve() {
this.stateIndex = 0;
this.states = modelSolve();
if (token != null)
token.cancel();
token = GuiTimer.scheduleAtFixedRate(() -> {
if (stateIndex >= states.size()) {
token.cancel();
} else {
pnl_main.state = states.get(stateIndex);
stateIndex++;
pnl_main.repaint();
}
}, 0, 500, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
SwingMain frame = new SwingMain();
frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
System.out.println(frame.pnl_main.getWidth());
System.out.println(frame.pnl_main.getHeight());
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.