-3

わかりましたので、comboBox と JTextField があります。数量を選択すると、テキスト フィールドに表示されます。テキストフィールド内のものを取得する別のクラスがありますが、注文クラスはカタログクラスから情報を取得しません。

class Catalogue extends JPanel {

    String[] h1Quantity = {"0","1","2","3","4","5","6","7","8","9","10"};
    h1CBox = new JComboBox <String> (h1Quantity);
    h1CBox.setSelectedIndex(0);
    h1CBox.addActionListener (new Listener());
    h1CBox.setPreferredSize ( new Dimension (50,30));


    JLabel noBooks = new JLabel ("Quantity");

    booksF = new JTextField(8);


public class Listener implements ActionListener {
        public void actionPerformed (ActionEvent event) {            
            int total = h1CBox.getSelectedIndex();
            booksF.setText(Integer.toString(total));
        }
}


public String booksFText() {
       return booksF.getText();
    }
}


class Order extends JPanel {


   Catalogue catalogue ;

   public Order (Catalogue catalogue)
   {
      this.catalogue = catalogue; 

     JPanel panel = new JPanel (); 
     String text2= catalogue.booksFText();
     textArea1 = new JTextArea (text2, 20, 35);
     add(textArea1);
     add(panel); 
   }

}

私はJavaが初めてなので、シンプルにしてください。どうもありがとう。

4

2 に答える 2

2

Orderクラスには 2 つのコンストラクターがありcatalogue、最初のコンストラクターでのみ設定されます。これを 2 番目のコンストラクターでも設定すると、NPE がなくなるはずです (ただし、スタック トレースがないと確実に知ることは困難です!)

于 2013-05-01T11:07:36.760 に答える
1

常に完全なコードを投稿するようにしてください。スタックトレースも。

注文クラスを参照してください。

class Order extends JPanel {

   public Order (Catalogue catalogue)
   {
     add(textArea);
   }

}

2 番目のコンストラクターを使用すると、クラス変数カタログにメモリが割り当てられません。したがって、NULL POINTER EXCEPTION . 2 番目のコンストラクター内のコードは、最初のコンストラクターに移動されました。

もう 1 つの理由は、オーダー コンストラクターに渡される変数が適切に定義されていない可能性があります。このようなことを行う必要があります。

Catalogue catalogue = new Catalogue();
Order order = new Order(catalogue);

更新されたカタログ クラスを参照してください。

class Catalogue extends JPanel {

    String[] h1Quantity = {"0","1","2","3","4","5","6","7","8","9","10"};
    JComboBox<String> h1CBox ;  //Assuming you forgot to define it.
    JLabel noBooks ;
    JTextField booksF ;


    //Define a new constructor
    public Catalogue () {

      //set jlabel 
      noBooks = new JLabel ("Quantity");      

      //set combobox
      h1CBox = new JComboBox <String> (h1Quantity);
      h1CBox.setSelectedIndex(0);
      h1CBox.addActionListener (new Listener());
      h1CBox.setPreferredSize ( new Dimension (50,30));

      //set textfield 
      booksF = new JTextField(8);  

      //add UI items to your panel class
      add(h1CBox); //combobox
      add(noBooks); // label
      add(booksF); // textfield
    }


public class Listener implements ActionListener {
        public void actionPerformed (ActionEvent event) {            
            int total = h1CBox.getSelectedIndex();
            booksF.setText(Integer.toString(total));
        }
}


public String booksFText() {
       return booksF.getText();
    }
}

UI は常にこのように定義してください。もちろん、もっと良い方法があります。したがって、コードはきれいに見え、物事を理解できます。コメントを付けて、どこかで何をしようとしたかを思い出させる方法を学びます。

メインクラス

public class Main {
  static JTextArea textArea = new JTextArea(40,40);

  static class Order extends JPanel{
     public Order(){
        add(textArea);
     }
  }

  static class Catalogue extends JPanel{
    ....

    private ActionListener listener = new ActionListener(){
      public void actionPerformed(ActionEvent event){
              textArea.setText(h1CBox.getSelectedIndex()+"");
       }
    }; 
  }

  public static void main(String args[]){
    //Construct a frame and add panels and you are good to go.
  }

}

最後の提案として、textarea のデータを自分で変更しない場合は、textarea の代わりに textfield または label を使用してください。textarea 内のテキストが設定されている場合もありますが、境界が不適切なため、ユーザーは見ることができません。したがって、テキストエリアをラベルまたはテキストフィールドに置き換えるだけです。乾杯 :)

于 2013-05-01T11:19:46.420 に答える