2017-09-10 6 views
-1

これは私が取り組んでいる課題です:"サークル"クラスとJavaのコンストラクタに関する問題?

"作業する図形を選択するためのグラフィカルユーザインタフェースを持つJavaプロジェクトを作成してください:Square、Rectangle、Circle、Triangle

は、彼らは形状のために寸法を入力し、図形の面積を計算するために選択することができます。

あなたは、基本クラス「形」を使用して、するために形状を継承する4つの異なるクラスを持っていますAreaの計算は、適切なクラスのarea()メソッドを使用するものとします。

私の考えは、同じグループのラジオボタンでユーザーがシェイプを選択し、それぞれのテキストフィールドに寸法(高さと幅)を入力させることでした。彼らはそれらの両方を行った後、ボタンを押すと形状の面積が計算されます。

私は基本的なShapeクラスと4つの継承クラスを作成しました。私は可能な限りGUIでメインクラスに「接続」しましたが、サークルエリアを計算しようとすると、私はCircle領域をwidthフィールドで計算する(数式には1次元のみが必要なため)場合、プログラムはユーザーに高さと幅の両方のフィールドに数値を入力させたいので例外が発生します。私はこれに対処するために複数のコンストラクタを設定しましたが、明らかに何か間違ったことをしました。他のすべての図形はうまく計算されています。ここで

は、ボタンを押したときのための私の主な(GUI)のコードである:ここでは

private void buttonAreaActionPerformed(java.awt.event.ActionEvent evt) {           

     int height = Integer.parseInt(tfHeight.getText()); 
     int width = Integer.parseInt(tfWidth.getText()); 

     try { 
      Square mySquare = new Square(height,width); 
      Circle myCircle = new Circle(width); 
      Triangle myTriangle = new Triangle(height,width); 
      Rectangle myRectangle = new Rectangle(height,width); 

      double result = 0; 

      if (rbSquare.isSelected()) { 
       result = mySquare.area(); 
      }//end of if block 
      else if (rbCircle.isSelected()){ 
       result = myCircle.area(); 
      } 
      else if (rbTriangle.isSelected()){ 
       result = myTriangle.area(); 
      } 
      else if (rbRectangle.isSelected()){ 
       result = myRectangle.area(); 
      }//end of else block 

      JOptionPane.showMessageDialog(this, "Area is " + result); 
     }//end of try block 
     catch (NumberFormatException ex) { 
      //Display new window with text upon catching exception 
      JOptionPane.showMessageDialog(this, "Please enter the proper dimensions"); 
     }//end of catch block 
    }           

は、基本Shapeクラスのコードです:ここで

public class Shape extends mainWindow { 
    //create properties for class 
    int width; 
    int height; 

    //default constructor to override method 
    public Shape(){ 
     //"this" uses properties above 
     width = 0; 
     height = 0; 
    }//end of constructor 

    //create the constructor (same as the class name) and pass it arguments 
    public Shape(int height, int width){ 
     //"this" uses properties above 
     this.height = height; 
     this.width = width; 
    }//end of constructor 

    public Shape(int width) { 
     this.width = width; 
    } 

はCircleクラスのコードです:

public class Circle extends Shape { 
    //constructor 
    Circle(int width){ 
     this.width = width; 

    } 

    public double area(){ 
     return Math.PI*(width*width); 
    } 
} 

ユーザーがサークルオプションを選択してから幅の次元を入力したときに再度表示するには、エラー。彼らは高さと幅のボックスに次元を入力する必要があります(これは実際には高さの値を取って計算に使用しませんが、高さのテキストフィールドを入力する必要があります)

誰でも助けることができます私はこれを理解するか、どこに間違っていたか教えてください。ここ

例外スタックトレースである:スレッド "AWT-EventQueueの-0" java.lang.NumberFormatExceptionで

例外: "java.lang.NumberFormatException.forInputStringの" (NumberFormatException.java:入力文字列について65)bism3800.mainWindow.buttonAreaActionPerformedでjava.lang.Integer.parseInt(Integer.java:615) でjava.lang.Integer.parseInt(Integer.java:592) (mainWindow.java:150) ででbism3800.mainWindow.access $ 000(mainWindow.java:14) at bism3800.mainWindow $ 1.actionPerformed(mainWindow.java:71) at javax.swing.AbstractButton.fireAc tionPerformed(AbstractButton.java:2022)javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2348)javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)で javax.swing.DefaultButtonModelで で 。 BasicButtonListener.basic.BasicButtonListener.mouseReleased(BasicButtonListener)で、setPressed(DefaultButtonModel.java:259) を取得します。java:252) at java.awt.Component.processMouseEvent(Component.java:6533) (javax.swing.JComponent.processMouseEvent(JComponent.java:3324)) at java.awt.Component.processEvent(Component.java: 6298) at java.awt.Container.processEvent(Container.java:2236) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2294) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) at java.awt.Container.dispatchEventImpl(Container.java:2280) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access $ 500(EventQueue.java:97) at java.awt.EventQueue $ 3.run(EventQueue.java:709) at java.awt.EventQueue $ 3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(ネイティブメソッド) at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java。 security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) java.awt.EventQueue $ 4.run(EventQueue.java:731) at java.awt.EventQueue $ 4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(ネイティブメソッド) at java。 java.awt.EventDispatchThread.pumpOneEventForFiltersでjava.awt.EventQueue.dispatchEvent(EventQueue.java:728) でsecurity.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) (EventDispatchThread.java:201)は、Javaで 。 java.awt.EventDispatchThread.pumpEventsでawt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) で(EventDispatchThread.java:101)するjava.awtで 。 EventDispatchThread.pumpEvents(EventD ispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

+0

完全な例外スタックトレースメッセージを送信してください。これはあなたの問題を解決するための鍵であり、いつも質問で投稿する必要があります。 –

+0

サブクラスはスーパーのコンストラクタを独自のコンストラクタ内で呼び出す必要があります。 –

+0

あなたの問題はちょうどあなたが高さのフィールドにparseintをやろうとしているようです。 – ControlAltDel

答えて

3

あなたのコードは、あなたがしていることをしています。リスナーの冒頭では、両方テキストフィールドからテキストを抽出し、それらを解析し、これはラジオボタンがを選択されているにかかわらず、その起こる:

private void buttonAreaActionPerformed(java.awt.event.ActionEvent evt) { 

    // this code is **always** run, no matter what 
    int height = Integer.parseInt(tfHeight.getText()); 
    int width = Integer.parseInt(tfWidth.getText()); 

明白な解決策は、これを実行することではありませんが。何が必要なのか、いつ必要なのか、そしてif文の中でのみ解析する。

重要な問題は、最も重要なデバッグステップを実行していないことです。コードを精通し、あらゆるステップで何が行われているかを理解することです。これを今、頻繁にやり始めます。 How to Think Like a Computer Scientist記事を1として

プログラムのためには、あなたは、プログラムがどのように動作するかのメンタルモデルを持っている必要があります。あなたが期待したことをしないプログラムを書くと、非常に頻繁に問題はプログラムにはありません。それはあなたの精神モデルにあります。

関連する問題