2017-05-19 18 views
0

私は単純なウィンドウを作成し、 'Main'クラスの変数にデータを与えるクラスを作ろうとしています。異なるコードで同じコードが機能していませんか?

あなたは私がJTextFieldの中に入力されたデータが文字列である場合には(ちょうどトライの後 - キャッチ)場合、それはキャッチを起動し、次のようにするために4つの変数を初期化している見ることができるのactionPerformedでtry-catchブロックで
public class Input extends JFrame{ 

int catch_catcher=1; 
private JTextField i1; 
private JTextField i2; 
private JTextField i3; 
private JTextField i4; 
private JButton ok; 
private GridLayout layout; 
public Input(){ 

    super("Input Window"); 
    setLayout(new FlowLayout()); 
    i1 =new JTextField("Enter the number of row 1st Mat.",20); 
    i2 =new JTextField("Enter the number of column 1st Mat.",20); 
    i3 =new JTextField("Enter the number of row 2nd Mat.",20); 
    i4 =new JTextField("Enter the number of column 2nd Mat.",20); 
    ok = new JButton("OKay"); 
    add(i1); 
    add(i2); 
    add(i3); 
    add(i4); 
    add(ok); 
    ok.addActionListener(
       new ActionListener(){ 

       public void actionPerformed(ActionEvent e) { 
         if(i1.equals("Enter the number of row 1st Mat.") || i2.equals("Enter the number of column 1st Mat.") || i3.equals("Enter the number of row 2nd Mat.") || i4.equals("Enter the number of column 2nd Mat.")){ 
          JOptionPane.showMessageDialog(null,"Warning","Please prvude required data",JOptionPane.PLAIN_MESSAGE); 
         } 
         try{ 
          int chk = Integer.parseInt(i1.getText()); 
          int chk2 = Integer.parseInt(i2.getText()); 
          int chk3 = Integer.parseInt(i3.getText()); 
          int chk4 = Integer.parseInt(i4.getText()); 
          System.out.println("Sucessful"); 
         }catch(Exception execpt){ 
          JOptionPane.showMessageDialog(null, "Warning", "Please Enter valid String", JOptionPane.PLAIN_MESSAGE); 
          catch_catcher=0; 
         } 

         if(catch_catcher==1){ 
          Main Obj=new Main(); 
          Obj.getVals(); 
          Obj.calculate(); 
         } 
        } 




       } 
      ); 


} 
int get1(){ 
    return Integer.parseInt(i1.getText()); //this is the line 
} 
int get2(){ 
    return Integer.parseInt(i2.getText()); 
} 
int get3(){ 
    return Integer.parseInt(i3.getText()); 
} 
int get4(){ 
    return Integer.parseInt(i4.getText()); 
} 
} 

声明実行されません。また、tryブロックが完全に実行されたかどうかを調べるSystem.out.println()もあります。そして、以下のメソッドでこれらのコードを使用できることを示す "Successful"を表示します(間違っていますか?エラーにもかかわらずブロックを完全に実行しますか?)。しかし、問題はget1()メソッドにエラーがあります。 。 このメソッドは次のように呼び出されます。

public void getVals(){ 
    Input in = new Input(); 
    d1 = in.get1(); 
    d2 = in.get2(); 
    d3 = in.get3(); 
    d4 = in.get4(); 
} 

エラーは言う:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException:  
For input string: "Enter the number of row 1st Mat." 
at java.lang.NumberFormatException.forInputString(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at main.Input.get1(Input.java:70) 
at main.Main.getVals(Main.java:19) 
at main.Input$1.actionPerformed(Input.java:56) 

ウィンドウがポップアップ表示されます。私はいくつかの数値を入力しました。すべての値は正確に3であった。そしてOKボタンを押すとすぐにエラーが表示されます。メインクラスの

コード:

import javax.swing.JFrame; 
public class Main { 
private int d1; 
private int d2; 
private int d3; 
private int d4; 
Scanner input = new Scanner(System.in); 
public static void main(String[] args) { 
    Input inpt = new Input(); 
    inpt.setVisible(true); 
    inpt.setSize(450, 450); 
    inpt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
public void getVals(){ 
    Input in = new Input(); 
    d1 = in.get1(); 
    d2 = in.get2(); 
    d3 = in.get3(); 
    d4 = in.get4(); 
} 
/*public void calculate(){ 
    if (d2 == d3) { 
     int[][] MatA = new int[d1][d2]; 
     for (int i = 0; i < d1; i++) { 
      for (int j = 0; j < d2; j++) { 
       System.out.printf(" Enter [%d,%d]th element of first matrix", i + 1, j + 1); 
       MatA[i][j] = input.nextInt(); 
      } 
     } 
     int[][] MatB = new int[d3][d4]; 
     for (int i = 0; i < d3; i++) { 
      for (int j = 0; j < d4; j++) { 
       System.out.printf(" Enter [%d,%d]th element of second matrix", i + 1, j + 1); 
       MatB[i][j] = input.nextInt(); 
      } 
     } 
     int newM[][] = new int[d1][d4]; 
     int y; 
     for (int x = 0; x < d1; x++) { 
      y = 0; 
      int a = 0; 
      while (y < d4) { 
       if (a < d2) { 
        newM[x][y] += MatA[x][a] * MatB[a][y]; 
        a++; 
       } else { 
        y++; 
        a=0; 
       } 
      } 
     } 
     for (int a[] : newM) { 
      for (int b : a) { 
       System.out.printf("%d \n", b); 
      }} 
     }else{ 
      System.out.println("Sorry Multiplication not possible ! Dimention error !"); 
     } 
     endstopper(); 
    } 
    public static void endstopper(){ 
     Scanner input = new Scanner(System.in); 
     input.nextLine(); 
    }*/ 
} 

私は計算ブロックの原因がまだ呼び出されていないコメントしています。私はScannerがドライランで使用されたので削除していません。

+0

に値を渡す別の問題は、NumberFormatExceptionが横にあなたのコードにも存在するように、自分のメインクラスのコードを投稿してください。 –

+0

申し訳ありませんが、Obj.calculateをコメントアウトすることを忘れてしまいます。 –

+0

[NumberFormatExceptionとは何ですか?それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/39849984/what-is-a-numberformatexception-and-how-can-i-fix-it) – xenteros

答えて

2

あなたMainが作成されます0123の新しいインスタンスは、すべてのテキストフィールドにプロンプ​​トテキストが入力されていることを示します。

public void getVals(){ 
    Input in = new Input(); 
    d1 = in.get1(); 
    d2 = in.get2(); 
    d3 = in.get3(); 
    d4 = in.get4(); 
} 

このメソッドのインスタンスは、このメソッドで作成したインスタンスとは関係ありません。代わりに

、方法

public void getVals(int value1, int value2, int value3, int value4){ 
    d1 = value1; 
    d2 = value2; 
    d3 = value3; 
    d4 = value4; 
} 


try { 
    int chk = Integer.parseInt(i1.getText()); 
    int chk2 = Integer.parseInt(i2.getText()); 
    int chk3 = Integer.parseInt(i3.getText()); 
    int chk4 = Integer.parseInt(i4.getText()); 
    System.out.println("Sucessful"); 

    Main Obj=new Main(); 
    Obj.getVals(chk, chk2, chk3, chk4); 
    Obj.calculate(); 
} catch (Exception execpt) { 
    JOptionPane.showMessageDialog(null, "Warning", "Please Enter valid String", JOptionPane.PLAIN_MESSAGE); 
} 
+0

と言っていません。コードがどのように動作するかわからないので、前提を作り、そのような回答を投稿するのではなく、間違っているものを修正してください。 –

+0

@ KrzysztofCichocki質問を完全に読んでください、私がここに示したすべてのコードは、質問に提示されたコードに基づいています。仮定はありません - 私の答えを引き起こした声明は* "そして" Successful "私は以下のメソッドでこれらのコードを使用することができます "* – MadProgrammer

+0

@ KrzysztofCichocki右上のコードスニペットを読んでください*"エラーが発せられます: " - OPが問題の原因となっている正確なコードを提示しました – MadProgrammer

0

これは、ユーザーが入力した番号だけでなく、入力からテキスト全体を解析しているため、入力用のプロンプトテキストをたとえばに入力するためです。

入力クラスは、入力された値を読み取ろうとする前にユーザーが[OK]ボタンを押すのを待つJDialogです。また、あなたは、新しいインスタンスからのデータは、これらの数字が入力された、私もこれを修正しました一のinstaed、このプログラムが動作するようになりましたなっていた - 少なくとも、それは私のマシン上でやった:)

import java.util.Scanner; 

public class Main { 
    private int d1; 
    private int d2; 
    private int d3; 
    private int d4; 
    Scanner input = new Scanner(System.in); 

    public static void main(String[] args) { 
     new Main().getVals(); 
    } 

    public void getVals() { 
     Input in = new Input(); 
     in.setModal(true); 
     in.setTitle("Input Window"); 
     in.setSize(300, 300); 
     in.setVisible(true); 
     d1 = in.get1(); 
     d2 = in.get2(); 
     d3 = in.get3(); 
     d4 = in.get4(); 
     calculate(); 
    } 

    public void calculate() { 
     if (d2 == d3) { 
      int[][] MatA = new int[d1][d2]; 
      for (int i = 0; i < d1; i++) { 
       for (int j = 0; j < d2; j++) { 
        System.out.printf(" Enter [%d,%d]th element of first matrix", i + 1, j + 1); 
        MatA[i][j] = input.nextInt(); 
       } 
      } 
      int[][] MatB = new int[d3][d4]; 
      for (int i = 0; i < d3; i++) { 
       for (int j = 0; j < d4; j++) { 
        System.out.printf(" Enter [%d,%d]th element of second matrix", i + 1, j + 1); 
        MatB[i][j] = input.nextInt(); 
       } 
      } 
      int newM[][] = new int[d1][d4]; 
      int y; 
      for (int x = 0; x < d1; x++) { 
       y = 0; 
       int a = 0; 
       while (y < d4) { 
        if (a < d2) { 
         newM[x][y] += MatA[x][a] * MatB[a][y]; 
         a++; 
        } else { 
         y++; 
         a = 0; 
        } 
       } 
      } 
      for (int a[] : newM) { 
       for (int b : a) { 
        System.out.printf("%d \n", b); 
       } 
      } 
     } else { 
      System.out.println("Sorry Multiplication not possible ! Dimention error !"); 
     } 
     endstopper(); 
    } 

    public static void endstopper() { 
     Scanner input = new Scanner(System.in); 
     input.nextLine(); 
    } 
} 

と入力クラス:

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 
import javax.swing.border.TitledBorder; 

public class Input extends JDialog { 

    int catch_catcher = 1; 
    private JTextField i1; 
    private JTextField i2; 
    private JTextField i3; 
    private JTextField i4; 
    private JButton ok; 
    private GridLayout layout; 

    public Input() { 
     super(); 
     // super("Input Window"); 
     setLayout(new FlowLayout()); 
     i1 = new JTextField(20); 
     i1.setBorder(new TitledBorder("Enter the number of row 1st Mat.")); 
     i2 = new JTextField(20); 
     i2.setBorder(new TitledBorder("Enter the number of column 1st Mat.")); 
     i3 = new JTextField(20); 
     i3.setBorder(new TitledBorder("Enter the number of row 2nd Mat.")); 
     i4 = new JTextField(20); 
     i4.setBorder(new TitledBorder("Enter the number of column 2nd Mat.")); 
     ok = new JButton("OKay"); 
     add(i1); 
     add(i2); 
     add(i3); 
     add(i4); 
     add(ok); 
     ok.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       if (i1.equals("Enter the number of row 1st Mat.") || i2.equals("Enter the number of column 1st Mat.") 
         || i3.equals("Enter the number of row 2nd Mat.") 
         || i4.equals("Enter the number of column 2nd Mat.")) { 
        JOptionPane.showMessageDialog(null, "Warning", "Please prvude required data", 
          JOptionPane.PLAIN_MESSAGE); 
       } 
       setVisible(false); 
      } 

     }); 

    } 

    int get1() { 
     return Integer.parseInt(i1.getText()); // this is the line 
    } 

    int get2() { 
     return Integer.parseInt(i2.getText()); 
    } 

    int get3() { 
     return Integer.parseInt(i3.getText()); 
    } 

    int get4() { 
     return Integer.parseInt(i4.getText()); 
    } 
} 

また、それは数値のみを受け入れるように入力フィールドをrestirctするのがベストだろう、ここではSOのことを行うにはどのように完全な答えがある:Is there any way to accept only numeric values in a JTextField?

+0

あなたの答えは「スレッド内の例外」AWT-EventQueue-0「java.lang」を生成します。NumberFormatException: 入力文字列: "" ' - 問題を理解するために必要なすべての情報が質問に表示されますが、それを読むために準備する必要があります – MadProgrammer

+0

*"また、新しいインスタンスからデータを取得しました。これらの数字が入力されたものの "* - ああ、実際には、あなたは – MadProgrammer

関連する問題