简体   繁体   English

如何停止GUI无限打印文本? -Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM