【问题标题】:Java Swing simple programJava Swing 简单程序
【发布时间】:2011-02-23 06:17:38
【问题描述】:

我是一名新的 Java 程序员,我一直在尝试设置一个简单的 Swing 程序,该程序允许用户在 JTextFields 中输入两个整数,当单击“添加”JButton 时,两个数字相加,然后sum 在 JLabel 中输出。

这我可以处理,但是,我遇到困难的地方是能够设置两个 JTextField 以将无效数字视为零。例如,如果输入了字符“x”或“xxx”,这将导致该 JTextField 的值为 0,以便进行添加。到目前为止,我使用 try/catch 和 if/else 语句没有任何成功。在过去的两天里,我还在互联网上搜索了几个小时,为这个问题寻找一些解决方案,但没有任何结果。

任何帮助将不胜感激!我到目前为止的代码如下所示......

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Adder extends JPanel implements ActionListener {

   JButton addBut = new JButton("Add");
   JTextField field1 = new JTextField("Number 1"),
   field2 = new JTextField("Number 2");
   JLabel numSum = new JLabel("=");

       Adder() {
             this.setPreferredSize(new Dimension(299, 43));
             addBut.addActionListener(this);
             setLayout(new FlowLayout());
             add(field1);
             add(field2);
             add(numSum);
             add(addBut);            
       }

        public void actionPerformed(ActionEvent ae) {
           if(ae.getSource().equals(addBut)){

             try {
                double one = Double.parseDouble(field1.getText());
                double two = Double.parseDouble(field2.getText());
                numSum.setText("" + (one + two));
             }           

                catch(Exception ex) {
             }
        } 

                else {
                    field1.setText(" ");
                    field2.setText(" ");
                    numSum.setText("");
             }
        }

                public static void main(String[] args){
                   JFrame jf=new JFrame();
                   jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                   Adder x = new Adder();
                   jf.add(x);
                   jf.pack();
                   jf.setVisible(true);
              }
        }

【问题讨论】:

    标签: java swing types try-catch


    【解决方案1】:

    使用 JFormattedTextFiled 并将 NumberFormat 设置为仅允许有效数字。

    或者在你的代码中添加一些抛出异常的处理

    double one = Double.parseDouble(field1.getText());                 
    double two = Double.parseDouble(field2.getText()); 
    

    在你的 catch 块中显示一两个不正确的消息。

    【讨论】:

      【解决方案2】:

      Here is the example 使用 JFormattedTextField 创建数字文本字段。

      另一个显示how InputVerifier works

      【讨论】:

        【解决方案3】:

        这里有几个问题。

        首先,永远不要通过提供一个空的 catch 块来“吞下”异常。这根本不是一个好主意。至少,如果没有预料到异常,那么只需使用 printStackTrace() 或(更好)记录器打印堆栈跟踪。如果预计会出现异常(例如您的情况),请做一些有意义的事情。在您的情况下,如果您真的想将无效数字视为零(这也不是一个好主意),那么您可能应该这样做:

          double one;
          double two;
          try {
            one = Double.parseDouble(field1.getText());
          }
          catch(NumberFormatException ex) {
            one = 0.0;
          }
          try {
            two = Double.parseDouble(field2.getText());
          }
          catch(NumberFormatException ex) {
            two = 0.0;
          }
          numSum.setText("" + (one + two));
        

        当然,您可以通过首先将两个变量初始化为零,然后只是“吞下”异常来获得相同的结果。但这不太可读,因为您不会立即看到应该使用零的时间。这种方法的另一个问题是,如果有其他代码路径没有为 1 和 2 分配任何东西,那么编译器将不会发出“可能未初始化的变量错误”。

        其次,如您所见,这里需要两个 try/catch 块。这就是为什么这些操作是独立的,即使第一个操作失败,您仍然希望第二个操作运行。使用单个 try 块,它会在中断后立即停止执行,这可能会使您的第二个变量保持不变,因为第一个变量格式错误。

        第三,永远不要捕获“异常”类或更高级别,除非可能在 main() 方法或线程的 run() 方法中。即使在那里也永远不要捕捉到“Throwable”,因为不应该捕捉到错误。在这种特殊情况下,您对格式错误的数字感兴趣,因此 NumberFormatException 是正确的捕获方法。你不关心这里的其他异常,如果有一些不同的问题,你当然不希望文本被视为零数字。

        最后,不是真正的主题,但 if(ae.getSource().equals(addBut)) 的东西在这里真的是多余的。您不订阅任何其他操作,因此您的 else 块将永远不会被执行。即使您确实订阅了其他操作,最好为每个操作使用内部类创建单独的侦听器,而不是将所有内容放在一个包含大量 ifs 的大型侦听器中。

        【讨论】:

        • 你在这里提出了很多很好的观点。我对 Java (尤其是 Swing)比较陌生,所以我对其中的一些东西有点摸不着头脑。当然,使用您描述的方法,在上述程序中还有很大的优化和更清晰的编码空间。再次感谢您的帮助!
        【解决方案4】:

        试试

        double one = 0.0;
        double two = 0.0;
         try {
           one = Double.parseDouble(field1.getText());
         }
         catch(Exception ex) {
            field1.setText("0");
         }
        
         try {
            two = Double.parseDouble(field2.getText());
         }
         catch(Exception ex) {
           field2.setText("0");
         }
        
        numSum.setText("" + (one + two));
        

        【讨论】:

        • 非常感谢!这帮了大忙!
        猜你喜欢
        • 2012-03-21
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 2021-08-10
        • 2019-07-23
        • 2012-10-07
        • 1970-01-01
        相关资源
        最近更新 更多