我创建了一个GUI,每次按键都会打印出一个列表。或者我是这么想的。。。但是,GUI并没有在按键时运行我所做的功能,而是一直在运行。
这是我的代码:
package main;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
public class Elements{
static ArrayList<String> composition = new ArrayList<String>();
static Boolean x = true;
static JLabel gLabel = GUI();
public static void main(String[] args){
while(x == true){
gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Q"), "water");
gLabel.getActionMap().put("water", water());
gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("W"), "life");
gLabel.getActionMap().put("life", life());
}
}
public static Action water(){
if(composition.contains("Fire")){
composition.remove("Fire");
composition.add("Steam");
} else if(composition.contains("Cold")){
composition.remove("Cold");
composition.add("Ice");
} else if(composition.contains("Arcane")){
composition.remove("Arcane");
composition.add("Poison");
} else if(composition.contains("Lightning")){
composition.remove("Lightning");
} else {
composition.add("Water");
}
int y = 0;
while(y < 100){
System.out.println("");
y++;
}
System.out.println(composition);
x = true;
return null;
}
public static Action life(){
if(composition.contains("Arcane")){
composition.remove("Arcane");
} else {
composition.add("Life");
}
int y = 0;
while(y < 100){
System.out.println("");
y++;
}
System.out.println(composition);
x = true;
return null;
}
private static JLabel GUI(){
JFrame frame = new JFrame("KeyPress Handler");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("This window listens for key presses and does stuff with them. Isn't that cool?");
label.setPreferredSize(new Dimension(175, 100));
frame.getContentPane().add(label, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
return label;
}
}
它不是在按键时运行life()
和water()
,而是一直运行它们。
我得到的输出
[Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life, Water, Life]
不接触任何东西!
我不知道为什么会发生这种情况,但我认为这与以下因素有关:gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Q"), "water");
和:
gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("W"), "life");
如果有人能告诉我问题出在哪里以及如何解决,那就太好了。
谢谢,Helen
附言:我增加了两行:gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Enter"), "stop");
gLabel.getActionMap().put("stop", stop());
函数stop()
如下:
public static Action stop(){
x = false;
return null;
据我所知,这意味着将stop()
的新密钥绑定添加到Space
。
此外,在进行这些改变之后,输出减少到[Water, Life]
。
(此外,修复了while循环)
while ( x = true )
必须更改为while ( x == true )
并且您必须在代码中(无论在哪里,尤其是在main中,因为x
是一个静态变量)将x
的值更改为false。
也就是说,我不确定你想要实现什么,我认为你走错了方向。
while(x = true){
-->您必须在while条件中将x布尔变量设置为false。while循环中没有其他内容。