使用GUI进行输入验证(Java)

4
我正在使用Java GUI创建(已经创建)一个贷款支付计算器。其中一些计算是错误的,我将修复它们,所以不要在意这些。我真正需要帮助的是用户输入验证。我尝试使用try/catch块,但在NetBeans中catch Exception处一直出现红色下划线。为什么会出现这些下划线,这是否是正确的验证类型?如果需要更多代码或信息,请告诉我。这是主类/驱动程序代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class LoanCalculator extends JFrame {
// Create text fields for interest rate, years
// loan amount, monthly payment, and total payment


private static final JTextField INTEREST_RATE = new JTextField();
private static final JTextField LOAN_YEARS = new JTextField();
private static final JTextField LOAN_AMOUNT = new JTextField();
private static final JTextField MONTHLY_PAYMENT = new JTextField();
private static final JTextField TOTAL_PAYMENT = new JTextField();

// Create a Compute Payment button
private static final JButton LOAN_COMPUTE = new JButton("Compute Payment");

public LoanCalculator() {
    // Panel p1 to hold labels and text fields
    //setSize (FRAME_WIDTH, FRAME_HEIGHT);
    JPanel labelPanel = new JPanel(new GridLayout(6, 2));
    labelPanel.add(new JLabel("Annual Interest Rate"));
    labelPanel.add(INTEREST_RATE);
    labelPanel.add(new JLabel("Number of Years"));
    labelPanel.add(LOAN_YEARS);
    labelPanel.add(new JLabel("Loan Amount"));
    labelPanel.add(LOAN_AMOUNT);
    labelPanel.add(new JLabel("Monthly Payment"));
    labelPanel.add(MONTHLY_PAYMENT);
    labelPanel.add(new JLabel("Total Payment"));
    labelPanel.add(TOTAL_PAYMENT);
    labelPanel.setBorder(new TitledBorder("Enter loan amount, interest rate, and years"));

    // Panel p2 to hold the button
    JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    buttonPanel.add(LOAN_COMPUTE);

    // Add the panels to the frame
    add(labelPanel, BorderLayout.CENTER);
    add(buttonPanel, BorderLayout.SOUTH);

    // Register listener
    LOAN_COMPUTE.addActionListener(new ButtonListener());
}

/**
 * Handle the Compute Payment button
 */
private class ButtonListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // Get values from text fields
    try{
        double interest = Double.parseDouble(INTEREST_RATE.getText());
        int year = Integer.parseInt(LOAN_YEARS.getText());
        double loanAmount = Double.parseDouble(LOAN_AMOUNT.getText());

        // Create a loan object
        Loan loan = new Loan(interest, year, loanAmount);

        // Display monthly payment and total payment
        MONTHLY_PAYMENT.setText(String.format("%.2f", loan.getMonthlyPayment()));
        TOTAL_PAYMENT.setText(String.format("%.2f", loan.getTotalPayment()));
    }catch (Exception ex){
        JOptionPane.showMessageDialog(this, ex.getMessage(), "Error," , JOptionPane.ERROR_MESSAGE));
    }           

    }
}

public static void main(String[] args) {
    LoanCalculator frame = new LoanCalculator();
    frame.pack();
    frame.setTitle("LoanCalculator");
    frame.setLocationRelativeTo(null); // Center the frame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

}


错误信息会告诉你为什么出现了下划线。它告诉你什么? - Hovercraft Full Of Eels
在 Throwable 类中,getMessage 无法应用于给定类型。 - kandaspohn
抱歉,不小心按了回车键。同时显示“必需参数:无”和“找到:LoanCalculator.ButtonListener,String,String,int”。 - kandaspohn
当你询问我的try块中是否有任何异常抛出时,除了double或int之外的任何东西都算作Throwable吗?还是我说得不清楚?我还是很新手,对术语不是很熟悉 :-) - kandaspohn
当我将它放入Eclipse时,会出现以下错误:JOptionPane中的showMessageDialog(Component, Object, String, int)方法不适用于参数(NaturalNumber.ButtonListener, String, String, int)。 - swingMan
1个回答

1
JOptionPane showMessageDialog方法的第一个参数应该是GUI组件,而你的参数不是,因为它实际上是内部监听器类。所以请改成这样:
    JOptionPane.showMessageDialog(this, ex.getMessage(), 
        "Error,", JOptionPane.ERROR_MESSAGE));

转换为:

    JOptionPane.showMessageDialog(LoanCalculator.this, ex.getMessage(), 
        "Error", JOptionPane.ERROR_MESSAGE); // extra parenthesis removed

作为旁注,仅仅捕获 Exception 并不是一个好的想法,因为这会把你的捕获范围扩大得太大。更好的方法是捕获特定的、可能预期的异常。
此外,从这个问题中可以学到的一课是,你需要仔细阅读所有的错误和异常信息,因为它们通常会告诉你出了什么问题以及在哪里,而且通常并不难理解。

尝试过了,但我仍然得到相同的错误信息。 - kandaspohn
@kandaspohn:不,你会得到一个不同的错误信息——在JOptionPane方法的末尾有太多的结束括号))。再次阅读错误信息并进行批判性思考。 - Hovercraft Full Of Eels
@ Hovercraft Full Of Eels:完美!非常好用! - kandaspohn
公共静态无返回值showMessageDialog(Component parentComponent, Object message)。 - Thilina Dharmasena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接