Java 不同的Enter和鼠标单击事件

Java 不同的Enter和鼠标单击事件,java,swing,button,awt,keylistener,Java,Swing,Button,Awt,Keylistener,我有一个按钮可以调用一个方法,在这个方法中,它调用另一个方法来连接数据库并返回结果,如果结果为正,则更改标签并启用按钮,如果结果为负,则按钮仍处于禁用状态 问题是,我在TF中设置了一个keytyped事件,如果有人在其中键入新内容,请禁用btnEditar: public void keyTyped(KeyEvent e) { btnEditar.setEnabled(false);

我有一个按钮可以调用一个方法,在这个方法中,它调用另一个方法来连接数据库并返回结果,如果结果为正,则更改标签并启用按钮,如果结果为负,则按钮仍处于禁用状态

问题是,我在TF中设置了一个keytyped事件,如果有人在其中键入新内容,请禁用btnEditar:

            public void keyTyped(KeyEvent e) {                  
                    btnEditar.setEnabled(false);
                    btnDeletar.setEnabled(false);
            }
我不希望此事件“捕获”enter以禁用按钮
有一种方法可以做到这一点,或者我不得不认为我有另一种逻辑方法?

正如其他人所指出的,除了使用
键侦听器之外,还有其他方法可以做到这一点。我将在下面回应您最初的尝试。
KeyListener
是用于此工作的功能强大且易于使用的工具

使用
按键
而不是
按键
,这样您就有了一个有效的按键代码,可以用来忽略回车键:

public void keyPressed(KeyEvent e) { // not keyTyped!
    if (e.getKeyCode() != KeyEvent.VK_ENTER) {
        btnEditar.setEnabled(false);
        btnDeletar.setEnabled(false);
    }
}
如果出于某种原因坚持使用
keyTyped
,但可以通过检查换行符或回车符来覆盖大多数情况:

public void keyTyped(KeyEvent e) {
    if (e.getKeyChar() != 13 && e.getKeyChar() != 10) {
        btnEditar.setEnabled(false);
        btnDeletar.setEnabled(false);
    }
}

使用DocumentListener侦听文档中文本的更改。阅读上Swing教程的部分。

您是否要求在按enter键时使用它?它不会禁用按钮?只需使用document listener它比
keyevent
容易得多,并且在插入、更改和删除值时也会收到通知。例如,您可以在监听器的每个抽象方法中调用一个方法,如
updateTF(){//检查textfield是否包含字符,如果(document.getLength()>0)tf.setEnabled(true);}
,而
DocumentListener肯定有合理的用途,并且它可以在这里完成任务,这个答案是误导性的,没有解释原因。它也没有解决OP的特定问题——使用
KeyListener
本身并不会阻止对enter键的检测。@JasonC,应该使用DocumentsTener而不是KeyListener来侦听文档中的更改。我还知道,按Enter键不会生成文档事件,因此不应该担心它。@user2582318,它可能会工作,但这不是解决问题的最佳方法。使用Swing时不应使用KeyListener。Swing有更好的API可供使用。@camickr它干净、精确、直观,适用于OP的特定情况。
DocumentListener
也是一个很好的解决方案,可以隐式地避免按下enter键。在各种情况下,使用
DocumentListener
而不是
KeyListener
有很多原因;但“应该”和“更好”都不在原因之列。改进答案的一种方法是指出如何使OP的尝试以其尝试的方式起作用,并建议使用
DocumentListener
作为替代方案,描述其优点。:)@JasonC,
改进答案的一个方法是指出如何使OP的尝试有效,就像他尝试的那样
——我不打算推广旧的编程实践。Swing已经发展并拥有更好的API。DocumnentListener是“更好”的解决方案,原因我已经概述过了。不幸的是,大多数人坚持原来的解决方案,因为他们只需要更改一两行代码。伙计,工作很好,你是最好的,非常感谢,并解释为什么!!!我想我再也不会犯这种“错误”了:)!不要使用幻数(13,10)。正如我在回答中提到的,当您使用DocumentListener时,这些事件甚至不会生成,因此不需要使用排除某些事件的代码。需要明确的是,如果您继续使用
keylister
,我建议使用
keyPressed
VK\u ENTER
,因为按键代码不受特定于区域设置的字符编码的约束。
它干净、精确、直接
-我不同意。要求(据我所知)是知道文档中的文本何时更改。添加排除逻辑并不简单。首先,您需要知道要排除哪些关键事件。另外,当您开始从文本字段中删除字符时会发生什么情况?通常,该按钮将重新启用。使用这种方法很难做到这一点,因为您需要再次监听特定的按键笔划(例如,backspace和delete按钮)。
DocumentListener也有相同的注意事项……
-不,因为我们不关心KeyEvents。我们关心文本。更抽象的API通常更好、更容易使用。处理insert/remove的独立API使您可以灵活地执行任何需要的操作。我没有提供OPs要求的实施,因为坦率地说,它们并不清楚。我将OP引入了一个更易于使用的API。人们在做决定之前应该学习这两种方法。