java无法更新JLabel数组
我在写一个东西,它有一个JLabel
数组,在第一个索引中有一些东西,然后检测将东西向右移动的正确键。基本上,[x][[]启动,然后如果我按正确的键,它将切换到[][x][[]。目前,我无法使JLabel
正确更新。一开始它显示正确,但当我按正确的键时,整个事情就搞砸了。也就是说,它是这样开始的:
(我有数字来衡量换档情况,当我解决这个问题时,数字就会消失)
这是正确的,但当我按正确的键时,一切都消失了(只是空白)但是,我在控制台中的测试仍然提供了正确的值
这些数字甚至没有显示出来:/
以下是相关代码:
public Template() {
for (int i = 0; i < 7; i++) {
positions[i] = new JLabel();
positions[i].setFont(new Font("Times New Roman", Font.PLAIN, 15));
System.out.println("Yay");
}
// I initialize my JLabel array here instead of below because if I don't do this, there's no change whatsoever if I press the right key. I'm not sure if I did it correctly, though.
initialize(p1, 0);
}
private void initialize(String p, int index) {
frame = new JFrame();
JPanel header = new JPanel();
header.setBackground(Color.WHITE);
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
header.setLayout(gbl);
header.setPreferredSize(new Dimension(400, 50));
c.fill = GridBagConstraints.HORIZONTAL;
for (int i = 0; i < 7; i++) {
if (i == index) {
positions[i].setText(p + "");
System.out.println("indexed set");
} else {
positions[i].setText("" + i);
System.out.println(positions[i].getText());
System.out.println("set");
}
c.gridx = i;
c.gridy = 0;
header.add(positions[i], c);
}
frame.add(header, BorderLayout.NORTH);
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playMove(p);
}
public void playMove(String p) {
...
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent keyEvent) {
System.out.println("Game.keyPressed -- event: " + keyEvent);
if (keyEvent.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right key pressed!");
int index = searchHeader();
System.out.println("index: " + index);
if (index != 6) {
int shift = index + 1;
System.out.println("shift: " + shift);
SwingUtilities.updateComponentTreeUI(frame);
initialize(p, shift, t);
}
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
System.out.println("Game.keyReleased -- event: " + keyEvent);
}
});
}
public int searchHeader() {
for (int i = 0; i < 7; i++) {
String val = positions[i].getText();
if (val == "x" || val == "o") {
System.out.println("i:" + i);
return i;
}
}
return 0;
}
我的System.out.println()
;所有测试都返回正确的值(正确的索引、移位和数组中的数字),但我不确定为什么没有显示:/
如果我的代码需要澄清或遗漏了什么(我从上一篇文章中得到建议后确实删除了一些不相关的信息),请告诉我
# 1 楼答案
由于您没有提供一个我们可以复制到IDE、运行和调试的最小可运行示例,因此我提出了这个示例GUI,它显示了一个向右移动的X
我使用向右箭头键执行换档
这是启动应用程序时的GUI
这是将X移动三个位置后的GUI
这是移动X四个位置后的GUI
Oracle有一个有用的教程Creating a GUI With Swing。跳过Netbeans部分
我做的第一件事是通过调用
SwingUtilities
invokeLater
方法来启动Swing应用程序。此方法确保在Event Dispatch Thread上创建和执行Swing组件接下来,我创建了一个
JFrame
。必须按特定顺序调用JFrame
方法。这是我在Swing应用程序中使用的顺序我创建了一个主
JPanel
来保存八个JLabels
的数组。我还创建了一个int来保持X的位置。我使用FlowLayout来布局JLabels
的数组。I(使用Box类在JLabels
之间放置一些空格在创建更复杂的游戏时,请使用普通的Java getter/setter类创建应用程序模型
我使用键绑定将右箭头键绑定到
Action
类。我使用了AbstractAction
,所以我只需要编写actionPerformed
方法下面是完整的可运行代码