单击输入数字按钮时如何保持对 JTextField 的关注?
How to keep Focus on JTextField while clicking input number buttons?
我是 GUI 方面的新手,遇到以下问题。我有 3 个 JTextFields、信用卡号、有效期和安全号码。我能够在字段中输入信息。我还为每个按钮实现了焦点侦听器。如果我点击它,它会说获得焦点,如果我点击其他任何地方,它就会失去焦点。在这些文本字段下,我有一个数字键盘(触摸 screen/mouse 单击)来输入数字。我如何保持专注于该特定文本字段,直到仅且具体地单击其他两个文本字段之一?一旦我尝试单击输入数字,当前具有焦点的文本字段将失去焦点。我不希望这发生。我在网上搜索,但找不到适合我的情况的内容。如有任何帮助或提示,我们将不胜感激。
myJButton.setFocusable(false);
或者如果 allMyButtons
集合中有一堆按钮:
for (JButton button: allMyButtons) {
button.setFocusable(false);
}
就是这样。
除了@Hovercrafts 建议 (+1),您可能还想扩展 TextAction
以将数字插入文本字段的逻辑。 TextAction
使您可以访问最后一个具有焦点的文本字段,因此插入代码变得非常通用:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.text.*;
public class NumpadPanel extends JPanel
{
public NumpadPanel()
{
setLayout( new BorderLayout() );
JTextField textField1 = new JTextField(4);
JTextField textField2 = new JTextField(2);
JTextField textField3 = new JTextField(2);
JPanel panel = new JPanel();
panel.add( textField1 );
panel.add( textField2 );
panel.add( textField3 );
add(panel, BorderLayout.PAGE_START);
Action numberAction = new TextAction("")
{
@Override
public void actionPerformed(ActionEvent e)
{
JTextComponent textComponent = getFocusedComponent();
if (textComponent != null)
textComponent.replaceSelection(e.getActionCommand());
}
};
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(0, 5) );
add(buttonPanel, BorderLayout.CENTER);
for (int i = 0; i < 10; i++)
{
String text = String.valueOf(i);
JButton button = new JButton( text );
button.addActionListener( numberAction );
button.setMargin( new Insets(20, 20, 20, 20) );
button.setFocusable( false );
buttonPanel.add( button );
}
// Optionally auto tab when text field is full
//SizeDocumentFilter sf = new SizeDocumentFilter();
//sf.installFilter(textField1, textField2, textField3);
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("Numpad Panel");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new NumpadPanel() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
您可能还想考虑使用 Text Field Auto Tab,以便在文本字段变满时焦点从文本字段移动到文本字段。