【问题标题】:keyReleased is not executing codekeyReleased 没有执行代码
【发布时间】:2015-12-03 06:40:15
【问题描述】:

如果两个 jtextfield 为空或不为空,我正在使用 keyReleased 来启用或禁用 jbutton。我在方法中放置了一些打印行语句,以便在方法执行时查看布尔值。这些语句从不打印,让我相信该方法没有被执行。 jbutton 应该开始禁用,直到将文本输入到两个 Jtextfields 中,然后启用 jbutton。

CalculateButton.addKeyListener(new KeyAdapter()
    {
        @Override
        public void keyReleased(KeyEvent arg0)
        {
            // the two jtextfields being checked for length
            boolean first = ipAddress.getText().length() > 0;
            boolean secoundnd = borrowedBits.getText().length() > 0;

            // print statements of the boolean values
            System.out.println("IpAddress " + first);
            System.out.println("borrowedBits"  + secoundnd);


            // if statements checking to see if the button should be enabled 
            or disabled after each key press. 
            if (ipAddress.getText().length() > 0 && borrowedBits.getText().length() > 0)
            {
                CalculateButton.setEnabled(true);;

            }

            if (ipAddress.getText().length() == 0 || borrowedBits.getText().length() == 0)
            {
                CalculateButton.setEnabled(false);;

            }




        }

【问题讨论】:

  • 将关键监听器添加到文本字段而不是按钮。如果它被禁用,则不会调用该方法。
  • 感谢您的帮助!
  • 变量名不应以大写字符开头。你的一些变量是正确的,有些不是。保持一致并从您在书籍、教程等中找到的示例中学习。

标签: java swing jbutton jtextfield keylistener


【解决方案1】:

jbutton 应该开始禁用,直到将文本输入到两个 Jtextfields 中,然后启用 jbutton

这是一个使用DocumentListener 的示例,它比为每个文本组件编写 if/else 语句要灵活得多。此解决方案更通用,适用于任意数量的文本字段。

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.*;

public class DataEntered implements DocumentListener
{
    private JButton button;
    private List<JTextField> textFields = new ArrayList<JTextField>();

    public DataEntered(JButton button)
    {
        this.button = button;
    }

    public void addTextField(JTextField textField)
    {
        textFields.add( textField );
        textField.getDocument().addDocumentListener( this );
    }

    public boolean isDataEntered()
    {
        for (JTextField textField : textFields)
        {
            if (textField.getText().trim().length() == 0)
                return false;
        }

        return true;
    }

    @Override
    public void insertUpdate(DocumentEvent e)
    {
        checkData();
    }

    @Override
    public void removeUpdate(DocumentEvent e)
    {
        checkData();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {}

    private void checkData()
    {
        button.setEnabled( isDataEntered() );
    }

    private static void createAndShowUI()
    {
        JButton submit = new JButton( "Submit" );
        submit.setEnabled( false );

        JTextField textField1 = new JTextField(10);
        JTextField textField2 = new JTextField(10);

        DataEntered de = new DataEntered( submit );
        de.addTextField( textField1 );
        de.addTextField( textField2 );

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.WEST);
        frame.add(textField2, BorderLayout.EAST);
        frame.add(submit, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    如果释放键时按钮被禁用,则该方法仍然不会被调用。您需要将KeyAdapter 附加到两个保持启用状态的文本字段。

    textField.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyReleased(KeyEvent arg0)
            {
               ...
            }
        });
    

    【讨论】:

    • 其实他需要把它添加到both文本域中。
    • @GergelyBacso 哎呀,这就是我想说的,但我想我的手指输入了别的东西。我进行了编辑。谢谢!
    • 错误答案——ActionListener被指定用于JButton,逻辑应该是在两个JTextFields中都添加DocumentListener,
    • @mKorbel 你能进一步解释一下吗?在我的计算机上使用 KeyListener 会产生所需的结果。
    • @Dando18,它可能有效,但 Swing 有更新更好的 API 可供使用,它们比 KeyListener 更好。例如,请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2012-01-12
    • 1970-01-01
    • 2017-10-20
    • 2017-05-12
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多