java swing:专注于输入键事件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11517935/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java swing: Focus lost on enter key event
提问by user613114
I have a button in my dialog. After pressing enter key in that dilog, actions assigned to that button is getting called one by one.
我的对话框中有一个按钮。在该对话框中按下 Enter 键后,分配给该按钮的操作将被一一调用。
public void buttonAction1() { }
....
public void buttonAction2() { }
In my dialog I also have one text field on which focus lost event is listened. Whenever initially focus is inside that textfield, I click tab or using mouse I click on button, focus lost event is called and opens a popup. This pop-up helps to set the value inside text field. This value will be used by action called on button press.
在我的对话框中,我还有一个文本字段,用于监听焦点丢失事件。每当最初焦点位于该文本字段内时,我单击选项卡或使用鼠标单击按钮,就会调用焦点丢失事件并打开一个弹出窗口。此弹出窗口有助于设置文本字段内的值。该值将由按下按钮时调用的操作使用。
public void focusLostAction() { }
Now the issue is that, when focus is inside text field and I press enter key, focus lost event is not getting called. So Pop-up is not getting opened and and proper values are not set inside that text field. but due to enter key event, action on that perticular button is getting called and this action is unable to find proper value inside text field.
现在的问题是,当焦点位于文本字段内并且我按下 Enter 键时,焦点丢失事件不会被调用。所以弹出窗口没有打开,并且没有在该文本字段中设置正确的值。但是由于输入键事件,该特定按钮上的操作被调用,并且此操作无法在文本字段中找到正确的值。
Inside the action method, which are called on enter key event, I have tried to set focus on button manually using:
在输入键事件调用的操作方法中,我尝试使用以下方法手动设置按钮的焦点:
public void buttonAction1() {
button.requestFocusInWindow();
}
public void buttonAction2() {
// do the remaining task
}
I also tried using, button.requestFocus;
我也试过使用 button.requestFocus;
I was expecting that setting focus manually on that button will call loose focus from text field and focus lost event may get called (as this is implemented in separate swing worker thread). But it is not working. Please let me know, If you have faced this issue earlier and the solution for the same. Thanks.
我期望在该按钮上手动设置焦点会从文本字段调用松散焦点,并且可能会调用焦点丢失事件(因为这是在单独的摆动工作线程中实现的)。但它不起作用。请让我知道,如果您之前遇到过这个问题以及相同的解决方案。谢谢。
采纳答案by nIcE cOw
Here second JTextField
is acting the way you want it to. Try your hands on this code example :
第二个JTextField
是按照你想要的方式行事。试试这个代码示例:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class TextFieldExample
{
private JTextField tfield1;
private JTextField tfield2;
private JLabel label;
private JButton button;
private FocusListener tfieldListener = new FocusListener()
{
@Override
public void focusGained(FocusEvent fe)
{
}
@Override
public void focusLost(FocusEvent fe)
{
System.out.println("I am LOST");
String num1 = tfield1.getText().trim();
String num2 = tfield2.getText().trim();
if (num1 == null || num1.equals(""))
num1 = "0";
if (num2 == null || num2.equals(""))
num2 = "0";
label.setText(Integer.toString(Integer.parseInt(num1) + Integer.parseInt(num2)));
}
};
private void displayGUI()
{
JFrame frame = new JFrame("Text Field Focus Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
tfield1 = new JTextField(10);
tfield2 = new JTextField(10);
tfield2.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
button.requestFocusInWindow();
}
});
tfield1.addFocusListener(tfieldListener);
tfield2.addFocusListener(tfieldListener);
((AbstractDocument)tfield1.getDocument()).setDocumentFilter(new MyDocumentFilter());
((AbstractDocument)tfield2.getDocument()).setDocumentFilter(new MyDocumentFilter());
label = new JLabel("SUM IS");
button = new JButton("USELESS");
contentPane.add(tfield1);
contentPane.add(tfield2);
contentPane.add(label);
contentPane.add(button);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
class MyDocumentFilter extends DocumentFilter
{
@Override
public void insertString(FilterBypass fb, int offset
, String text
, AttributeSet aset)
{
try
{
super.insertString(fb, offset, text.replaceAll("\D++", ""), aset);
}
catch(BadLocationException ble)
{
ble.printStackTrace();
}
}
@Override
public void replace(FilterBypass fb, int offset, int len
, String text
, AttributeSet aset)
{
try
{
super.replace(fb, offset, len, text.replaceAll("\D++", ""), aset);
}
catch(BadLocationException ble)
{
ble.printStackTrace();
}
}
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new TextFieldExample().displayGUI();
}
});
}
}
回答by Vishal Chaudhari
gain and lost focus from frame in java Swing Application
在 Java Swing 应用程序中从框架获得和失去焦点
public class MainFrame extends Frame {
Frame awe;
public MainFrame(Database database) {
awe = this;
this.addWindowFocusListener(new WindowFocusListener() {
@Override
public void windowGainedFocus(WindowEvent we) {
System.out.println("Gain Focus");
}
@Override
public void windowLostFocus(WindowEvent we) {
System.out.println("Lost Focus");
}
});
}
}