【问题标题】:Java Determine which textfield has FocusJava确定哪个文本字段具有焦点
【发布时间】:2013-12-05 19:38:41
【问题描述】:

我创建了按钮 1-9 以及 4 个文本字段。我试图让用户点击任何数字 1-9 来输入每个文本字段。但是,我无法确定用户点击了哪个字段。目前 1-9 按钮仅在 amt 文本字段中输入文本。如何检查单击了哪个字段并在其中输入输入?

新问题

 public void actionPerformed(ActionEvent e) {

    String iamt, ii, iterm,ipay;
    iamt = amt.getText();
    ii = interest.getText();
    iterm = term.getText();
    ipay = payment.getText();

有没有办法缩短这个 if 语句,这样我就没有按钮 1-10 的冗余代码?

    if(e.getSource()==btn1) {
        if(previouslyFocusedTextBox.equals(amt)){
            amt.setText("1");
            amt_number+=amt.getText();
            amt.setText(amt_number); 
        }
        else if (previouslyFocusedTextBox.equals(interest)){
            interest.setText("1");
            int_number+=interest.getText();
            interest.setText(int_number);
        }
        else if (previouslyFocusedTextBox.equals(term)){
            term.setText("1");
            t_number+=term.getText();
            term.setText(t_number);
        }
        else if (previouslyFocusedTextBox.equals(payment)){
            payment.setText("1");
            p_number+=payment.getText();
            payment.setText(p_number);
        }
    }

    if(e.getSource()==btnPay){
        Loan = new LoanforCalc(Double.parseDouble(iamt),Double.parseDouble(ii),Integer.parseInt(iterm));
            payment.setText(Double.toString(Loan.getPayment())); 
    }

【问题讨论】:

    标签: java swing jbutton jtextfield calculator


    【解决方案1】:

    我弄清楚了 OP 的意思,并快速解决了:

    基本上,一旦单击按钮,文本框就会失去焦点,因此我们必须跟踪之前拥有焦点的内容。

        import java.awt.FlowLayout;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.awt.event.FocusEvent;
        import java.awt.event.FocusListener;
        import java.io.FileNotFoundException;
    
        import javax.swing.JButton;
        import javax.swing.JFrame;
        import javax.swing.JTextField;
    
        public class FocusAwareWindow extends JFrame implements ActionListener, FocusListener {
            public static void main(String[] args) throws FileNotFoundException {
                FocusAwareWindow c = new FocusAwareWindow();
            }
            private JTextField textFieldA, textFieldB;
            private JButton buttonA, buttonB;
            private JTextField previouslyFocusedTextBox = textFieldA;
            public FocusAwareWindow(){
                super();
                this.setLayout(new FlowLayout());
    
                textFieldA = new JTextField();
                textFieldA.setText("Field A");
                textFieldA.setFocusable(true);
                textFieldA.addFocusListener(this);
                this.add(textFieldA);
    
                textFieldB = new JTextField();
                textFieldB.setText("Field B");
                textFieldB.setFocusable(true);
                textFieldB.addFocusListener(this);
                this.add(textFieldB);
    
                buttonA = new JButton("Which is focused?");
                buttonA.addActionListener(this);
                this.add(buttonA);
    
                this.pack();
                this.setVisible(true);;
            }
            public void actionPerformed(ActionEvent ev) {
                if(previouslyFocusedTextBox.equals(textFieldA)){
                    System.out.println("Text Field A");
                } else if(previouslyFocusedTextBox.equals(textFieldB)){
                    System.out.println("Text Field B");
                }
            }
            public void focusGained(FocusEvent ev) {
                if(ev.getSource() instanceof JTextField) {
                    previouslyFocusedTextBox = (JTextField) ev.getSource();
                }
            }
            public void focusLost(FocusEvent ev) {
            }
        }
    

    【讨论】:

    • 我曾尝试过例如 if(getFocusOwner() == amt) .. 但是这不起作用。
    • 我才意识到为什么这不起作用。见我上面的小例子[对不起,额外的缩进]
    • 感谢您的回复。我现在可以让它工作了。但是,我的问题是.. 有没有办法减少冗余,这样我就没有每个​​按钮的巨大 if 语句?查看已编辑的源代码。
    • 我不确定您的应用程序是如何构建的,但以某种方式将JTextFields 链接到它们所代表的数字可能是最简单的,也许使用HashMap。本质上,您想找到给定previouslyFocusedTextBox 的要更改的数字,而不是将其与所有JTextFields 进行比较。
    【解决方案2】:

    也许添加一个 mouseListener 并在 textFields 上创建区域?只是在这里猜测,但它可能会起作用。如果这是可能的,那么您只需要一个变量来跟踪您单击的区域,然后检查您想要的文本字段的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2021-01-27
      • 2010-11-09
      • 2023-03-25
      相关资源
      最近更新 更多