JDialog 组件不会显示
JDialog components won't show up
所以我有以下代码。
public class GraveyardFrame extends JDialog{
private List<JLabel> labelList = new ArrayList<>();
private List<Piece> pieces = new ArrayList<>();
public GraveyardFrame(final Player player) {
setSize(300,300);
setTitle("Graveyard Zone~ Watch out!!");
setResizable(false);
setModalityType(ModalityType.APPLICATION_MODAL);
setLocationRelativeTo(null);
setVisible(true);
createView(player); //here I add all the components
}
public void createView(Player player) {
JPanel mainPanel = new JPanel(new FlowLayout());
add(mainPanel);
mainPanel.setBackground(new Color(128,64,0));
createLabels(player ,mainPanel); //here I add the labels, that will take the icon of the dead pieces
this.pack();
}
private void createLabels(Player player , JPanel mainPanel) {
pieces.addAll(player.getPlayerGraveyard()); //pieces holds all the dead pieces
int sizeOfgraveyard = player.getPlayerGraveyard().size();
for (int i = 0 ; i < sizeOfgraveyard ; i++) {
JLabel label = new JLabel();
label.setSize(60, 60);
label.setIcon(pieces.get(i).getIcon());
labelList.add(label);
mainPanel.add(label);
mainPanel.validate();
mainPanel.repaint();
}
}
它应该弹出一个 JDialog,它获取一个棋手的所有死棋子并显示它们。
首先,我使用了 JFrame ,但我发现 JFrame 不能等待操作发生,然后才继续使用主 GUI。(在 JDialog 中,使用 ModalityType 就足够了)。
问题是它没有显示任何内容,只是一个空的 JDialog 框。我搜索了这个问题,here 有人说你应该使用 validate() 、repaint() 和 pack() 。我试过了,就像上面的代码一样,但仍然没有任何反应
它应该是这样的(适用于 JFrame 而不是 JDialog):
这就是它的实际样子(使用上面的代码):
您在 createView()
之前调用了 setVisible(true)
。但由于它是模态的 JDialog
,调用 setVisible()
实际上会阻塞,直到对话框被关闭。因此,createView()
只会在对话框关闭后被调用。
只需更改两个方法调用的顺序,先 createView()
然后再 setVisible(true)
,它应该可以工作。
所以我有以下代码。
public class GraveyardFrame extends JDialog{
private List<JLabel> labelList = new ArrayList<>();
private List<Piece> pieces = new ArrayList<>();
public GraveyardFrame(final Player player) {
setSize(300,300);
setTitle("Graveyard Zone~ Watch out!!");
setResizable(false);
setModalityType(ModalityType.APPLICATION_MODAL);
setLocationRelativeTo(null);
setVisible(true);
createView(player); //here I add all the components
}
public void createView(Player player) {
JPanel mainPanel = new JPanel(new FlowLayout());
add(mainPanel);
mainPanel.setBackground(new Color(128,64,0));
createLabels(player ,mainPanel); //here I add the labels, that will take the icon of the dead pieces
this.pack();
}
private void createLabels(Player player , JPanel mainPanel) {
pieces.addAll(player.getPlayerGraveyard()); //pieces holds all the dead pieces
int sizeOfgraveyard = player.getPlayerGraveyard().size();
for (int i = 0 ; i < sizeOfgraveyard ; i++) {
JLabel label = new JLabel();
label.setSize(60, 60);
label.setIcon(pieces.get(i).getIcon());
labelList.add(label);
mainPanel.add(label);
mainPanel.validate();
mainPanel.repaint();
}
}
它应该弹出一个 JDialog,它获取一个棋手的所有死棋子并显示它们。 首先,我使用了 JFrame ,但我发现 JFrame 不能等待操作发生,然后才继续使用主 GUI。(在 JDialog 中,使用 ModalityType 就足够了)。
问题是它没有显示任何内容,只是一个空的 JDialog 框。我搜索了这个问题,here 有人说你应该使用 validate() 、repaint() 和 pack() 。我试过了,就像上面的代码一样,但仍然没有任何反应
它应该是这样的(适用于 JFrame 而不是 JDialog):
您在 createView()
之前调用了 setVisible(true)
。但由于它是模态的 JDialog
,调用 setVisible()
实际上会阻塞,直到对话框被关闭。因此,createView()
只会在对话框关闭后被调用。
只需更改两个方法调用的顺序,先 createView()
然后再 setVisible(true)
,它应该可以工作。