Java 有没有办法在用户输入特定单词之前禁用JButton?

Java 有没有办法在用户输入特定单词之前禁用JButton?,java,Java,我正在尝试制作一个文本冒险游戏,每个房间都有谜题。我有去下一个房间的方向按钮,但如果按钮还没有正确回答问题,我希望按钮显示一条消息。当他们回答这个问题时,游戏会告诉他们可以走哪条路,按钮也会起作用。有什么办法可以这样做吗 我尝试过这样做,但唯一有效的方法是他们键入答案并将其保留在文本字段中,而不是键入enter。但我不想那样 private void northBtnMouseClicked(java.awt.event.MouseEvent evt) {

我正在尝试制作一个文本冒险游戏,每个房间都有谜题。我有去下一个房间的方向按钮,但如果按钮还没有正确回答问题,我希望按钮显示一条消息。当他们回答这个问题时,游戏会告诉他们可以走哪条路,按钮也会起作用。有什么办法可以这样做吗

我尝试过这样做,但唯一有效的方法是他们键入答案并将其保留在文本字段中,而不是键入enter。但我不想那样

private void northBtnMouseClicked(java.awt.event.MouseEvent evt) {                                      
    if(!playerInput.getText().equals(currentRoom.getAns()))
    {
        gameScreen.append("\nThe doors are locked until you answer the puzzle.");
    }
    else 
    {
       String direction = "north";
        Room nextRoom = currentRoom.getExits(direction);

        if(nextRoom == null)
        {
            gameScreen.append("\n There is not an exit that way\n");
        }
        else
        {
            currentRoom = nextRoom;
            gameScreen.append("\n" + currentRoom.getLongDescription());
        } 
    }
}                                     

我给你们举个例子,给你们一个想法,让你们重新开始

代码

public class NewClass {
    public static void main(String... args) {
        JButton jb = new JButton("Enter");
        jb.setEnabled(false);
        JTextField jt = new JTextField(15);

        JFrame jf = new JFrame();
        jf.setSize(200, 100);
        FlowLayout layout = new FlowLayout();
        jf.setLayout(layout);
        jf.add(jb);
        jf.add(jt);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
        jt.addKeyListener((new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                JTextField textField = (JTextField) e.getSource();
                String text = textField.getText();
                textField.setText(text.toUpperCase());
                if(!textField.getText().isEmpty())
                    jb.setEnabled(true);
                else
                    jb.setEnabled(false);
            }

        }));

    }
}
输出

public class NewClass {
    public static void main(String... args) {
        JButton jb = new JButton("Enter");
        jb.setEnabled(false);
        JTextField jt = new JTextField(15);

        JFrame jf = new JFrame();
        jf.setSize(200, 100);
        FlowLayout layout = new FlowLayout();
        jf.setLayout(layout);
        jf.add(jb);
        jf.add(jt);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
        jt.addKeyListener((new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                JTextField textField = (JTextField) e.getSource();
                String text = textField.getText();
                textField.setText(text.toUpperCase());
                if(!textField.getText().isEmpty())
                    jb.setEnabled(true);
                else
                    jb.setEnabled(false);
            }

        }));

    }
}

说明: 有很多方法可以实现你想要的。例如,键侦听器和文档侦听器。 好的做法是使用文档监听器,因为它不依赖于活动

注意:还有其他解决问题的好方法,但我认为这种方法更容易让您理解

看看这条评论

A会更好,因为这样可以让你对任何问题做出反应 对文本的更改,无论是否由按键触发 (例如,从剪贴板粘贴),您不必担心 不会导致文本更改的按键操作伊恩·罗伯茨

资料来源:

使用文档监听器方法,这是一种良好的做法,推荐使用

代码:


当然,你可以选择jbtn.setEnabled(false)直到你有了所有答案,或者(可能更容易)让你的鼠标点击例程访问答案计数,在问题得到回答之前忽略点击。

有很多方法可以实现这一点,最简单的方法之一可能是简单地禁用按钮直到用户输入您想要的内容

这样做的一个(次要)问题是,需要用户按下“操作”键(通常是Enter键),直到输入可以验证为止。这没什么大不了的,但对用户来说并不总是显而易见的

另一种方法是使用
DocumentListener
监控底层
文档的更改,并实时验证输入

这种方法允许您在用户键入时向他们提供实时反馈。它还允许用户将内容粘贴到字段中并对其进行验证,如果使用
KeyListener
,则无法进行验证

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TestDoc {

    public static void main(String[] args) {
        new TestDoc();
    }

    public TestDoc() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField field;
        private JButton button;

        public TestPane() {
            button = new JButton("Make it so");
            button.setEnabled(false);
            field = new JTextField(10);
            field.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    validateInput();
                }
            });
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(field, gbc);
            add(button, gbc);

            field.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    validateInput();
                }

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

                @Override
                public void changedUpdate(DocumentEvent e) {
                    validateInput();
                }
            });
        }

        public void validateInput() {
            String text = field.getText();
            if ("go".equals(text)) {
                button.setEnabled(true);
            } else {
                button.setEnabled(false);
            }
        }

    }

}


查看更多详细信息

Heh,不知道为什么我认为这是javascript。无论如何,我仍然建议使用单向加密对正确答案进行加密,java非常容易反编译。
JButton.setEnabled(true)?是的,您当然可以通过其
setEnabled(enabled)
方法禁用或启用JButtons。何时或如何调用它的逻辑将取决于程序的结构。请注意,我希望您不要在JButton中添加鼠标侦听器,因为这将不允许禁用按钮。JButtons是为了使用ActionListener和Actions而构建的,正是出于这个原因,因此它们实际上可以被禁用并响应空格键的单击。A更好,因为它可以让您对文本的任何更改做出反应,无论这些更改是否由按键触发(例如,从剪贴板粘贴),你不必担心按键不会导致文本改变。@IanRoberts谢谢你为我澄清更多,我看到了这个答案,但我不确定,所以我发布了这个:)我认为这种方式对新手来说已经足够好了,你不同意吗?
keylister
s在文本组件上被认为是一种不好的做法,因为它会导致文档变异问题,并且没有考虑到用户将内容粘贴到字段中可能发生的情况一个非常糟糕的建议是使用带有文本组件的KeyListener(编辑:我现在看到其他人已经告诉过你)。请不要这样做。请修正,这样我就可以摆脱-1投票。更好,但我自己,我更喜欢没有KeyListener代码。你能告诉我为什么说dos命令提示符是犯罪吗?不知道,我什么时候说的?