Как остановить мой графический интерфейс от печати текста на неопределенный срок? - Джава

Я создал графический интерфейс, который будет распечатывать список каждый раз, когда вы нажимаете клавишу. Или так я думал... Но вместо запуска функции, которую я сделал на нажатие клавиши, графический интерфейс просто делает это все время.

Вот мой код:

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. В вашем цикле пока нет ничего другого.

Другие вопросы по тегам