-3

好的,所以我有一个组合框和一个 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仅在第一个中设置。在第二个构造函数中也设置它,NPE 应该会消失(尽管没有堆栈跟踪很难确定!)

于 2013-05-01T11:07:36.760 回答
1

始终尝试发布完整的代码。和堆栈跟踪。

查看您的订单类别。

class Order extends JPanel {

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

}

如果使用第二个构造函数,那么类变量目录将不会被分配内存。因此 NULL POINTER EXCEPTION 。第二个构造函数中的代码已移至第一个构造函数。

另一个原因可能是在 order 构造函数中传递的变量没有正确定义。应该做这样的事情。

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 的数据,请使用 textfield 或 label 而不是 textarea。有时 textarea 里面的文字被设置了,但是由于边界不合适,用户看不到。所以,要确保只需用标签或文本字段替换文本区域。干杯:)

于 2013-05-01T11:19:46.420 回答