如何从jtextfield扫描输入?

dhxwm5r4  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(397)
import javax.swing.*;
import java.awt.event.*;
import java.util.Scanner;

@SuppressWarnings("unused")
public class Fun {
    @SuppressWarnings({"static-access", "resource"})
    public static void main(String[] args) {
        JFrame f = new JFrame("The Gamer Zone");
        //set size and location of frame
        f.setSize(390, 300);
        f.setLocation(100, 150);
        //make sure it quits when x is clicked
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //set look and feel
        f.setDefaultLookAndFeelDecorated(true);
        JLabel labelM = new JLabel("Are you an epic gamer? (true,false) ");
        labelM.setBounds(50, 50, 250, 30);
        JTextField Text = new JTextField();
        //set size of the text box
        Text.setBounds(50, 100, 200, 30);
        //add elements to the frame
        f.add(labelM);
        f.add(Text);
        f.setLayout(null);
        f.setVisible(true);
        String answer1 = Text.getText();
        Scanner sc = new Scanner(answer1);
        int x = 0;
        while (x < 1) {
            try {
                if (sc.next() == "true") {
                    f.remove(labelM);
                    x++;
                }
            } catch (Exception e) {
                System.out.println("Something went wrong");
            }
        }
    }
}

我想把它去掉 LabelM 当jtext字段中的输入为“true”时,我只是想学习 JFrame 这是我第一次用它工作。有没有更好的方法从电脑扫描 JFrame ?

snz8szmq

snz8szmq1#

您可能希望使用documentlistener,每当字段的文本发生更改时,它就会触发方法。当前示例只获取一次文本(在显示 JFrame 这一点永远不会改变,因为您使用了错误的方法/运算符进行比较 string 您应该使用的java对象 equals ,或类似的变体 contains 请参阅此处或此处了解更多信息。
还有其他几点(我可能听起来像一张破唱片):
不要使用 null / AbsoluteLayout 而是使用适当的布局管理器
不要打电话 setBounds() 或者 setSize() 在组件上,如果使用正确的布局管理器,这将为您处理
呼叫 JFrame#pack() 在使用 LayoutManager 所有swing组件都应该通过 SwingUtilities.invokeLater 下面是一个简单地隐藏或显示 JLabel 当单词true在 JTextField :

testapp.java文件:

import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TestApp {

    public TestApp() {
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestApp::new);
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame("TestApp");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(new EmptyBorder(20, 20, 20, 20));
        JLabel labelM = new JLabel("Are you an epic gamer? (true,false) ");
        JTextField textField = new JTextField();

        textField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void changedUpdate(DocumentEvent e) {
                checkForInput();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                checkForInput();
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                checkForInput();
            }

            public void checkForInput() {
                if (textField.getText().toLowerCase().equals("true")) {
                    labelM.setVisible(false);
                } else {
                    labelM.setVisible(true);
                }
            }
        });

        panel.add(labelM, BorderLayout.NORTH);
        panel.add(textField, BorderLayout.CENTER);

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

}

魔法发生在 checkForInputDocumentListener 连接到 JTextField ```
public void checkForInput() {
if (textField.getText().toLowerCase().contains("true")) {
labelM.setVisible(false);
} else {
labelM.setVisible(true);
}
}

如果要添加或删除标签而不是设置其可见性,只需使用 `panel.remove(labelM)` 或者 `panel.add(labelM)` 分别地

相关问题