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

时间:2014-09-14 22:33:31

标签: java

我正在尝试制作一个包含每个房间拼图的文字冒险游戏。我有方向按钮去下一个房间,但我希望按钮显示一条消息,如果他们还没有正确回答问题。当他们回答时,游戏会向他们展示他们可以走哪条路,按钮会起作用。反正有吗?

我尝试过这样做,但唯一可行的方法是,如果他们输入答案并将其保留在文本字段中,而不是输入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());
        } 
    }
}                                     

3 个答案:

答案 0 :(得分:1)

我只是举个例子给你一个想法并启动你

<强>代码

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);
            }

        }));

    }
}

<强>输出

enter image description here

<强>解释: 有很多方法可以实现你想要的。例如,Key Listener和Document Listener。 好的做法是使用Document Listener,因为它不依赖于活动。

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

查看此评论

  

一个DocumentListener会更好,因为它可以让你对任何一个做出反应   对文本的更改,无论是否由按键触发   (例如来自剪贴板的粘贴),您不必担心   按键不会导致文本发生变化。 - 伊恩罗伯茨

来源:http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

使用文档侦听器方法,这是一种很好的做法,建议

代码:

import java.awt.FlowLayout;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.Document;

public class DocumentListenerSample {

    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);

        DocumentListener documentListener = new DocumentListener() {
            @Override
            public void changedUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            @Override
            public void insertUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            @Override
            public void removeUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            private void printIt(DocumentEvent documentEvent) {
                Document source = documentEvent.getDocument();
                int length = source.getLength();
                if(length != 0)
                    jb.setEnabled(true);
                else
                    jb.setEnabled(false);
                  }
        };
        jt.getDocument().addDocumentListener(documentListener);

        jf.setSize(250, 150);
        jf.setVisible(true);
    }
}

答案 1 :(得分:1)

有许多方法可以实现,最简单的方法之一就是简单地禁用按钮,直到用户输入你想要的内容。

这个(次要)问题是它需要用户按下&#34;动作&#34;键(通常输入),直到可以验证输入。没什么大不了的,但对用户来说并不总是显而易见。

另一种方法是使用DocumentListener来监控对基础Document的更改并实时验证输入。

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

Make it so

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);
            }
        }

    }

}

有关详细信息,请查看Listening for Changes on a Document

答案 2 :(得分:0)

当然,您可以使用jbtn.setEnabled(false),直到您获得所有答案,或者(可能更容易)保持您的MouseClicked例程可以访问的答案计数,它只会忽略点击,直到问题得到解答。