[英]How to stop my GUI from printing text indefinitely? - Java
I have created a GUI that will print out a list every time you press a key. 我已经创建了一个GUI,该GUI将在您每次按键时打印出一个列表。 Or so I thought... But instead of running the function I've made on the key press, the GUI just does it all the time. 大概我以为...但是GUI不会一直运行我在按键上所做的功能,而是一直在执行它。
Here's my code: 这是我的代码:
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;
}
}
Instead of running life()
and water()
on a key press, it runs them all the time . 而不是通过按键运行life()
和water()
,而是始终运行它们。
I get the output of, 我得到的输出
[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]
without touching anything ! 不碰任何东西 !
I have got no idea why this is happening but I think it has to do with the: gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Q"), "water");
我不知道为什么会这样,但是我认为这与以下原因有关: gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Q"), "water");
and the: 和:
gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("W"), "life");
If anyone could tell me what the problem is and how to fix it, that would be great. 如果有人可以告诉我问题出在哪里以及如何解决,那将很棒。
Thanks, Helen 谢谢,海伦
PS: I added 2 new lines: gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Enter"), "stop");
PS:我添加了2行: gLabel.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("Enter"), "stop");
gLabel.getActionMap().put("stop", stop());
The function stop()
is as follows: 函数stop()
如下:
public static Action stop(){ x = false; return null;
As I understand it, this is meant to add a new key binding of stop()
to Space
. 据我了解,这是为了向Space
添加一个新的stop()
键绑定。
Also, after making these changes, the output was reduced to [Water, Life]
. 同样,在进行了这些更改之后,输出减少到[Water, Life]
。
(Also, fixed the while loop) (还修复了while循环)
while(x = true){
--> somehow you have to set x boolean variable false in your while condition. while(x = true){
->您必须在while条件下将x布尔变量设置为false。 There is nothing else in your while loop. while循环中没有其他内容。
while ( x = true )
has to be changed to while while ( x == true )
while ( x = true )
必须更改为while while ( x == true )
and you'll have to make it possible in your code (wherever, not especially in your main since x
is a static variable) to change the value of x
to false. 而且您必须在代码中(由于x
是静态变量,所以在任何地方,尤其是在您的主代码中,尤其如此)都可以将x
的值更改为false。
That said, I'm not sure what you're trying to achieve and I think you're going in the wrong direction. 就是说,我不确定您要达到的目标,我认为您的方向错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.