我的gui是使用SwingWorker更新的50x50 GridLayout。
GridLayout中的每个网格都有一个GridGraphic组件,它具有特定的强度 默认强度= 0,这只是一个黑色组件。如果强度= 5,则网格显示为黑色,带有黄点。
当按下Step按钮时,StepManager应该遍历所有网格并更新它们的强度,然后立即重新绘制所有内容,但StepManager在第一个具有强度= 5的alue的GridGraphic之后停止执行。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
public class Gui extends JFrame{
private JPanel buttonPanel, populationPanel, velocityPanel, gridPanel;
private JButton setupButton, stepButton, goButton;
private JLabel populationNameLabel, velocityNameLabel, populationSliderValueLabel, velocitySliderValueLabel;
private JSlider populationSlider, velocitySlider;
private GridGraphic [] [] gridGraphic;
private int agents = 125;
private int velocity = 500;
private boolean resetGrid;
private StepManager step;
public Gui() {
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
//Set up JButtons
buttonPanel = new JPanel();
setupButton = new JButton("Setup");
stepButton = new JButton("Step");
goButton = new JButton("Go");
buttonPanel.add(setupButton);
buttonPanel.add(stepButton);
buttonPanel.add(goButton);
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 3;
add(buttonPanel, c);
public GridGraphic getGridGraphic(int n1, int n2){
return gridGraphic[n1][n2];
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
Gui gui = new Gui();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Display the window.
gui.pack();
gui.setVisible(true);
gui.setResizable(false);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 0 :(得分:1)
我相信会发生的步骤是在一个单独的线程中执行,因此当你对它调用execute方法时,它会在一个单独的线程中开始执行,这可能在你调用repaint方法后完成执行。你想要的是在工人完成任务后调用重绘。查看SwingWorker的done()方法。
答案 1 :(得分:1)
你得到某种例外吗?
在您的代码中
for(int i = 0; i < 50; i++){
for(int j = 0; j < 50; j++){
if(grid[i][j].getIntensity()==5){
grid[i][j].setDefault();
grid[i-1][j-1].setAgent();
}
}
}
我可以看到一个ArrayIndexOutOfBoundsException,因为如果i或j为0并且grid [i] [0]和/或grid [0] [j]具有强度,则可能正在访问grid [-1] [ - 1] 5。
编辑:另一件事。在执行SwingWorker之后,您似乎只重画了一次GUI。但是,SwingWorker是一个线程,因此重绘将在工作人员启动后立即执行,而不是在完成之后执行。尝试用完成的方法调用重绘。