我正在为我的Java类开发一个应用程序,并遇到一个奇怪的问题。我需要在网格中表示数据,因此使用 GridLayout 是一个明显的选择,但这是一个问题。 我一直在拍摄几乎空白的框架(请注意左上角的小白色矩形)。
这是产生此结果的代码段
//not important class code
public static void main(String args[]) {
JFrame frame = new JFrame("Wolves & Rabbits");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//want to create a 12x9 grid with 2 black and 4 pink rectangles
Board board = new Board(12, 9, 2, 4, 1000);
frame.add(board);
frame.setResizable(false);
frame.setVisible(true);
}
//Board.java (Board class) extends JPanel
public JPanel fields[][];
private Integer boardWidth, boardHeight;
private ArrayList<AnimalThread> animals;
private Integer wolvesCount, rabbitsCount;
public Board(int w, int h) {
super(new GridLayout(h, w, 4, 4));
fields = new JPanel[w][h];
boardWidth = new Integer(w);
boardHeight = new Integer(h);
animals = null;
wolvesCount = new Integer(0);
rabbitsCount = new Integer(0);
//creating white rectangles
for (int i = 0; i < boardHeight; i++)
for (int j = 0; j < boardWidth; j++) {
fields[j][i] = new JPanel(true);
fields[j][i].setBackground(AnimalThread.NONE);
this.add(fields[j][i]);
}
AnimalThread.setLinkToBoard(this);
}
public Board(int w, int h, int wolves, int rabbits, int k) {
this(w, h);
animals = new ArrayList<AnimalThread>();
while (boardWidth*boardHeight < 2*wolves*rabbits) {
wolves--;
rabbits--;
}
wolvesCount = wolves;
rabbitsCount = rabbits;
WolfThread.setRabbitsCount(rabbitsCount);
//randomly place colored rectangles
this.randomize(wolves, rabbits, k);
}
奇怪的是,根本没有改变Board类,主要方法稍有改动,我能够显示正确的网格。
在这种情况下,主要方法是
//not important class code
public static void main(String args[]) {
JFrame frame = new JFrame("Wolves & Rabbits");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Board board = new Board(12, 9, 2, 4, 1000);
//THE CHANGE!
JPanel panel = new JPanel(new GridLayout(12, 9, 4, 4));
for (int i = 0; i < 9; i++)
for (int j = 0; j < 12; j++) {
JPanel tmp = board.fields[j][i];
panel.add(tmp);
}
frame.add(panel);
frame.setResizable(false);
frame.setVisible(true);
}
任何人都知道造成这个恼人问题的原因是什么?任何线索都将受到赞赏。
答案 0 :(得分:1)
当您使用Swing时,必须在EDT上执行Swing UI代码。所以至少你的主要方法应该是这样的:
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Wolves & Rabbits");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// want to create a 12x9 grid with 2 black and 4 pink rectangles
Board board = new Board(12, 9, 2, 4, 1000);
frame.add(board);
frame.setResizable(false);
frame.setVisible(true);
}
});
}
从其他线程访问Swing对象的变量然后EDT将导致问题。其中许多问题都是间歇性的,难以追踪(如大多数并发问题)。
'AnimalThread'对象的名称似乎暗示它是一个Thread。你不能(实际上你可以如你所示:-)直接摆动在EDT上“活着”的物体。如果另一个线程想要在EDT上更改某些内容,则需要使用'SwingUtilities.invokeLater'或'SwingUtilities.invokeAndWait'方法。