【问题标题】:Making calculations without pressing a button无需按下按钮即可进行计算
【发布时间】:2018-09-04 01:16:51
【问题描述】:

我正在制作一个计算三个规则的程序,但我不希望在按下按钮时开始计算,而是在添加 3 个所需值时开始。这是我的程序和代码的图像:

private void calculateActionPerformed(java.awt.event.ActionEvent evt) {                                          
    if (field4.getText().isEmpty()) {
        field4.setText(null);
        field1c = Float.parseFloat(field1.getText());
        field2c = Float.parseFloat(field2.getText());
        field3c = Float.parseFloat(field3.getText());
        float result = (field3c * field2c) / field1c;
        String resultfinal = Float.toString(result);
        field4.setText(resultfinal);
        option = 1;
    } else if (field3.getText().isEmpty()) {
        field1c = Float.parseFloat(field1.getText());
        field2c = Float.parseFloat(field2.getText());
        field4c = Float.parseFloat(field4.getText());
        float result = (field4c * field1c) / field2c;
        String resultfinal = Float.toString(result);
        field3.setText(resultfinal);
        option = 2;
    } else if (field1.getText().isEmpty()) {
        field2c = Float.parseFloat(field2.getText());
        field3c = Float.parseFloat(field3.getText());
        field4c = Float.parseFloat(field4.getText());
        float result = (field3c * field2c) / field4c;
        String resultfinal = Float.toString(result);
        field1.setText(resultfinal);
        option = 3;
    } else if (field2.getText().isEmpty()) {
        field1c = Float.parseFloat(field1.getText());
        field3c = Float.parseFloat(field3.getText());
        field4c = Float.parseFloat(field4.getText());
        float result = (field4c * field1c) / field3c;
        String resultfinal = Float.toString(result);
        field2.setText(resultfinal);
        option = 4;
    }

我确定我必须在某处使用线程,但我不确定如何在我的程序中实现它们。

【问题讨论】:

标签: java button listener


【解决方案1】:

首先为每个输入分配一个 KeyListener,以便他们知道您何时在其上键入、按下或释放键。每次在任何输入上按或键入一个键时,循环遍历每个和.getValue(),如果有多个与“”不同,则不要计算。

首先创建一个实现 KeyListener 的类,以便您的输入可以使用它。

class LoopWhenTyped implements KeyListener{

        public void keyTyped(KeyEvent e) {
            for(Component actualComponent : e.getSource().getParent().getComponents){
                 //here's where you're looping
            }
        }

        public void keyPressed(KeyEvent e) {}

        public void keyReleased(KeyEvent e) {}

}

在包含您的 GUI 的类中,创建我们刚刚创建的类的实例。

private myKeyListener = new LoopWhenTyped();

您必须将此侦听器添加到每个输入:

field1.addKeyListener(myKeyListener);
field2.addKeyListener(myKeyListener);
field3.addKeyListener(myKeyListener);
field4.addKeyListener(myKeyListener);

e 变量引用了一个 KeyEvent,所以 e.getSource() 返回触发该事件的任何内容,getParent() 将返回持有它的组件,getComponents() 返回它持有的所有组件。

当然,如果你迷路了,你必须使这个通用的解决方案适应你的代码结构,并稍微研究一下这个类。我希望它有所帮助。

【讨论】:

  • 不,不,不,从不向文本组件添加 KeyListener。您当然可以按照 MadProgrammer 的建议添加 FocusListener,将 DocumentListener 或 DocumentFilter 添加到其 Document,甚至添加 Key Binding 到组件,但绝不可以添加 KeyListener。
  • 为什么不使用 KeyListener?
  • 请参阅MadProgrammer's answer here 了解更多信息。他是最敏锐的专业 Swing 编码员之一
  • 还有here
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2013-12-15
  • 2018-06-24
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多