Java 如何聚焦事件输入字段和使用按钮
我有多个文本字段和按钮。当选择文本字段时,当按下按钮但未插入带以下代码的内容时,应向其添加文本。我错过了什么。 谢谢你的帮助Java 如何聚焦事件输入字段和使用按钮,java,swing,jbutton,jtextfield,Java,Swing,Jbutton,Jtextfield,我有多个文本字段和按钮。当选择文本字段时,当按下按钮但未插入带以下代码的内容时,应向其添加文本。我错过了什么。 谢谢你的帮助 public class ButtonExample_Extended extends JFrame implements ActionListener { public JPanel createContentPane (){ buttonPanel = new JPanel(); buttonPanel.setLayout(null)
public class ButtonExample_Extended extends JFrame implements ActionListener {
public JPanel createContentPane (){
buttonPanel = new JPanel();
buttonPanel.setLayout(null);
buttonPanel.setLocation(10, 50);
buttonPanel.setSize(1370, 770);
totalGUI.add(buttonPanel);
B9 = new JButton("9");
B9.setLocation(1190, 570);
B9.setSize(50, 50);
B9.addActionListener(this);
buttonPanel.add(B9);
JPasswordField passwordField = new JPasswordField(20);
passwordField.setLocation(900,565);
passwordField.setSize(120,30);
buttonPanel.add(passwordField);
}
private JTextComponent selectedTextField;
// TextFields onFocus event
private void a33FocusGained(java.awt.event.FocusEvent evt) {
selectedTextField = (JTextComponent) evt.getSource();
}
// action for button
public void actionPerformed (ActionEvent evt) {
if (evt.getSource() == B9)
selectedTextField.setText( selectedTextField.getText() + "9" );
}
}
在上面的代码中,我希望在textPasswordField中插入9,但实际上没有。你确定吗
private void a33FocusGained(java.awt.event.FocusEvent evt) {
selectedTextField = (JTextComponent) evt.getSource();
}
有人打过电话吗?我想您的类应该实现FocusListener并添加如下内容
passwordField.addFocusListener(this);
@Override
public void focusGained(FocusEvent e) {
selectedTextField = (JTextComponent) e.getSource();
}
@Override
public void focusLost(FocusEvent e) {
selectedTextField = null;
}
这是一个您应该做的示例代码(如果我理解正确的话),请注意,首先需要将光标设置到密码字段,然后按钮将工作,但是您可以在focusLost方法中看到这种方法的不好的一面
public class Snippet implements ActionListener, FocusListener {
public JFrame totalGUI = new JFrame();
private JPanel buttonPanel;
private JButton B9;
public Snippet() {
createContentPane();
}
public void createContentPane() {
buttonPanel = new JPanel(new GridBagLayout());
B9 = new JButton("9");
B9.addActionListener(this);
buttonPanel.add(B9);
JPasswordField passwordField = new JPasswordField(20);
passwordField.setSize(120, 30);
passwordField.addFocusListener(this);
buttonPanel.add(passwordField);
totalGUI.getContentPane().add(buttonPanel);
totalGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
totalGUI.pack();
}
private JTextComponent selectedTextField;
@Override
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == B9 && selectedTextField != null)
selectedTextField.setText(selectedTextField.getText() + "9");
}
public static void main(String[] args) {
new Snippet().totalGUI.setVisible(true);
}
@Override
public void focusGained(FocusEvent e) {
if(e.getSource() instanceof JTextComponent)
selectedTextField = (JTextComponent) e.getSource();
}
@Override
public void focusLost(FocusEvent e) {
// when you push the button the text field will lose focus
// selectedTextField = null;
}
}不要同时使用FocusListener和ActionListener。这假设事件将按特定顺序触发,即先获得焦点,然后执行操作。Swing不保证事件的顺序 相反,您可以扩展
TextAction
。TextAction是用于Swing组件的特殊操作,因为它跟踪具有焦点的最后一个组件。例如,要创建选择所有可以执行的文本的操作,请执行以下操作:
class SelectAll extends TextAction
{
public SelectAll()
{
super("Select All");
}
public void actionPerformed(ActionEvent e)
{
JTextComponent component = getFocusedComponent();
component.selectAll();
component.requestFocusInWindow();
}
}
然后,要使用您将执行的操作:
b9.addActionListener( new SelectAll() );
您的类是否实现了
ActionListener
?。您应该显示完整的运行代码。请尝试selectedTextField.setEnabled(true)@peeskillet是的,当然它实现了ActionListener,我也编辑了上面的代码,现在类行的声明是written@AJ没有为selectedTextField启用的方法可用名称集!