如何检查哪个文本字段可聚焦?
How to check which text field is focusable?
我创建了按钮 0-9 以及 4 个文本字段 (JTextField
)。我试图让用户点击任何数字 0-9 以输入每个文本字段。但是,我无法确定用户点击了哪个字段。因此,当用户 select 第二个字段时,它不会显示任何文本,它仅适用于第一个字段。
field = new JTextField();
field.setHorizontalAlignment(SwingConstants.RIGHT);
field.setText("");
field.setBounds(12, 12, 66, 34);
field.setBackground(Color.WHITE);
frame.getContentPane().add(field);
field.setColumns(10);
field.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field.setFocusable(true);
field.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f=false;
}
@Override
public void focusGained(FocusEvent arg0) {
f=true;
}
});
field2 = new JTextField();
field2.setText("");
field2.setHorizontalAlignment(SwingConstants.RIGHT);
field2.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field2.setColumns(10);
field2.setBackground(Color.WHITE);
field2.setBounds(90, 12, 66, 34);
field2.setFocusable(true);
field2.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f = false;
}
@Override
public void focusGained(FocusEvent arg0) {
f = true;
}
});
frame.getContentPane().add(field2);
field3 = new JTextField();
field3.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field3.setHorizontalAlignment(SwingConstants.RIGHT);
field3.setBounds(199, 12, 66, 34);
frame.getContentPane().add(field3);
field3.setColumns(10);
field3.setFocusable(true);
field3.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f=false;
}
@Override
public void focusGained(FocusEvent arg0) {
f=true;
}
});
field4 = new JTextField();
field4.setText("");
field4.setHorizontalAlignment(SwingConstants.RIGHT);
field4.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field4.setColumns(10);
field4.setBackground(Color.WHITE);
field4.setBounds(277, 12, 66, 34);
frame.getContentPane().add(field4);
field4.setFocusable(true);
field4.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f = false;
}
@Override
public void focusGained(FocusEvent arg0) {
f = true;
}
});
按钮示例:
JButton btn0 = new JButton("0");
btn0.setFont(new Font("Tahoma",Font.BOLD,15));
btn0.setBounds(199, 228, 80, 30);
frame.getContentPane().add(btn0);
btn0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (f==false) {
String num =
field.getText()+btn0.getText();
field.setText(num);
}else if (f==false) {
String num =
field2.getText()+btn0.getText();
field2.setText(num);
}else if (f==false) {
String num =
field3.getText()+btn0.getText();
field3.setText(num);
}
String
num=textField.getText()+btn0.getText();
textField.setText(num);
}
});
您只显示了代码片段,但我看起来您试图使用布尔值来跟踪选择了哪个字段。
我会跳过布尔值并引入一个新变量
JTextField current;
应该在每个 focusGained 方法中分配。跳过 focusLost 方法中的所有分配。因此,您将能够跟踪当前活动的文本字段。
另请注意,当用户单击按钮时将调用 focusLost 方法,因此不应使用它们。
您应该为按钮的 ActionListener
使用 TextAction
。 TextAction
实现了一个 getFocusedComponent()
方法,该方法将 return 给你最后一个获得焦点的文本组件。
因此,要将文本附加到最后一个具有焦点的文本组件,代码将类似于:
TextAction digit = new TextAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
JButton button = (JButton)e.getSource();
JTextComponent textField = getFocusedComponent();
textField.replaceSelection( button.getText() );
}
}
JButton button0 = new JButton("0");
button0.addActionListener(digit);
JButton button1 = new JButton("1");
button1.addActionListener(digit);
以上操作是通用的,因此您的所有按钮都可以使用它。它只会将按钮的文本附加到最后一个具有焦点的文本字段。
我创建了按钮 0-9 以及 4 个文本字段 (JTextField
)。我试图让用户点击任何数字 0-9 以输入每个文本字段。但是,我无法确定用户点击了哪个字段。因此,当用户 select 第二个字段时,它不会显示任何文本,它仅适用于第一个字段。
field = new JTextField();
field.setHorizontalAlignment(SwingConstants.RIGHT);
field.setText("");
field.setBounds(12, 12, 66, 34);
field.setBackground(Color.WHITE);
frame.getContentPane().add(field);
field.setColumns(10);
field.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field.setFocusable(true);
field.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f=false;
}
@Override
public void focusGained(FocusEvent arg0) {
f=true;
}
});
field2 = new JTextField();
field2.setText("");
field2.setHorizontalAlignment(SwingConstants.RIGHT);
field2.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field2.setColumns(10);
field2.setBackground(Color.WHITE);
field2.setBounds(90, 12, 66, 34);
field2.setFocusable(true);
field2.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f = false;
}
@Override
public void focusGained(FocusEvent arg0) {
f = true;
}
});
frame.getContentPane().add(field2);
field3 = new JTextField();
field3.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field3.setHorizontalAlignment(SwingConstants.RIGHT);
field3.setBounds(199, 12, 66, 34);
frame.getContentPane().add(field3);
field3.setColumns(10);
field3.setFocusable(true);
field3.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f=false;
}
@Override
public void focusGained(FocusEvent arg0) {
f=true;
}
});
field4 = new JTextField();
field4.setText("");
field4.setHorizontalAlignment(SwingConstants.RIGHT);
field4.setFont(new Font("Liberation Mono", Font.BOLD,
20));
field4.setColumns(10);
field4.setBackground(Color.WHITE);
field4.setBounds(277, 12, 66, 34);
frame.getContentPane().add(field4);
field4.setFocusable(true);
field4.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
f = false;
}
@Override
public void focusGained(FocusEvent arg0) {
f = true;
}
});
按钮示例:
JButton btn0 = new JButton("0");
btn0.setFont(new Font("Tahoma",Font.BOLD,15));
btn0.setBounds(199, 228, 80, 30);
frame.getContentPane().add(btn0);
btn0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (f==false) {
String num =
field.getText()+btn0.getText();
field.setText(num);
}else if (f==false) {
String num =
field2.getText()+btn0.getText();
field2.setText(num);
}else if (f==false) {
String num =
field3.getText()+btn0.getText();
field3.setText(num);
}
String
num=textField.getText()+btn0.getText();
textField.setText(num);
}
});
您只显示了代码片段,但我看起来您试图使用布尔值来跟踪选择了哪个字段。 我会跳过布尔值并引入一个新变量
JTextField current;
应该在每个 focusGained 方法中分配。跳过 focusLost 方法中的所有分配。因此,您将能够跟踪当前活动的文本字段。 另请注意,当用户单击按钮时将调用 focusLost 方法,因此不应使用它们。
您应该为按钮的 ActionListener
使用 TextAction
。 TextAction
实现了一个 getFocusedComponent()
方法,该方法将 return 给你最后一个获得焦点的文本组件。
因此,要将文本附加到最后一个具有焦点的文本组件,代码将类似于:
TextAction digit = new TextAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
JButton button = (JButton)e.getSource();
JTextComponent textField = getFocusedComponent();
textField.replaceSelection( button.getText() );
}
}
JButton button0 = new JButton("0");
button0.addActionListener(digit);
JButton button1 = new JButton("1");
button1.addActionListener(digit);
以上操作是通用的,因此您的所有按钮都可以使用它。它只会将按钮的文本附加到最后一个具有焦点的文本字段。