Как остановить мой графический интерфейс от печати текста на неопределенный срок? - Джава
Я создал графический интерфейс, который будет распечатывать список каждый раз, когда вы нажимаете клавишу. Или так я думал... Но вместо запуска функции, которую я сделал на нажатие клавиши, графический интерфейс просто делает это все время.
Вот мой код:
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");
Если бы кто-нибудь мог сказать мне, в чем проблема и как ее исправить, это было бы здорово.
Спасибо Елена
PS: я добавил 2 новые строки: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)
2 ответа
while ( x = true )
должен быть изменен на время while ( x == true )
и вам придется сделать это возможным в вашем коде (где бы то ни было, особенно в вашей основной x
является статической переменной), чтобы изменить значение x
ложно.
Тем не менее, я не уверен, что вы пытаетесь достичь, и я думаю, что вы идете в неправильном направлении.
while(x = true){
-> каким-то образом вы должны установить булеву переменную x в ваше условие while. В вашем цикле пока нет ничего другого.