我正在尝试制作一个包含每个房间拼图的文字冒险游戏。我有方向按钮去下一个房间,但我希望按钮显示一条消息,如果他们还没有正确回答问题。当他们回答时,游戏会向他们展示他们可以走哪条路,按钮会起作用。反正有吗?
我尝试过这样做,但唯一可行的方法是,如果他们输入答案并将其保留在文本字段中,而不是输入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());
}
}
}
答案 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);
}
}));
}
}
<强>输出强>:
<强>解释强>: 有很多方法可以实现你想要的。例如,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
,则无法进行验证。
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例程可以访问的答案计数,它只会忽略点击,直到问题得到解答。