0

JButton の ActionListener を追加する際に問題が発生しました。この問題の解決にご協力ください。

エラー:

Exception in thread "main" java.lang.NullPointerException
at searchDB.searchDB(searchDB.java:11)
at Ramses.main(Ramses.java:35)

メインクラス: Ramses.java

import javax.swing.JFrame;
import ...........;

public class Ramses {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Gui GuiObject = new Gui();
    GuiObject.Gui();

    searchDB searchObject = new searchDB();
    searchObject.searchDB(); //error here

}
}

JButton が宣言されているクラス: Gui.java

import javax.swing.*;
import........;

public class Gui {
public static JButton btnUpdate;
public void Gui() {
JButton btnSearch = new JButton("Search");
    btnSearch.setBounds(463, 112, 91, 23);
    btnSearch.setVisible(true);
    pnUpper.add(btnSearch);

 }
}

JButton ActionListener が実装されているクラス: searchDB.java

import javax.swing.*;

public class searchDB{

public void searchDB(){

    HandlerClass handler = new HandlerClass();
    Gui.btnSearch.addActionListener(handler); //error in this line

}
private class HandlerClass implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent event) {
        // TODO Auto-generated method stub
        String cstmrSearch = (String) Gui.cbCustomer.getSelectedItem();
        System.out.println("Selected Customer is :"+cstmrSearch);
    }


}
}

このコードの問題は何ですか??

4

3 に答える 3

2

スタックトレースは問題の良い指標です

voidのコンストラクターからキーワードを削除しますGui

public Gui() {

コンポーネント変数を割り当てることができるようにします。さらにJButton、コンストラクターの型を削除して、変数がシャドウされていないことを確認します。

btnSearch = new JButton("Search");

余談:staticフィールドは設計が悪いと見なされます。代わりにインスタンス変数を使用してください

于 2013-10-23T20:24:10.300 に答える
0

私は自分のクラスを少し違ったものにします。@Reimeusに同意します。静的フィールドの誤用を避ける必要があり、コンストラクターには戻り値の型があってはならないため、「疑似」コンストラクター、つまり戻り値の型がvoidのコンストラクターを避ける必要があります。

具体的には、これを次のように変更します。

public class Ramses {
  public static void main(String[] args) {
    Gui GuiObject = new Gui();
    GuiObject.Gui();
    searchDB searchObject = new searchDB();
    searchObject.searchDB(); //error here
  }
}

これに:

public class Ramses {
  public static void main(String[] args) {
    Gui gui = new Gui();  // variables should begin with lower-case letter
    // GuiObject.Gui();  // not needed
    SearchDB searchObject = new SearchDB(gui); // pass GUI object in
     // searchObject.searchDB(); // don't need this
  }
}

これからGuiを変更します:

public class Gui {
public static JButton btnUpdate;
public void Gui() {
JButton btnSearch = new JButton("Search");
    btnSearch.setBounds(463, 112, 91, 23);
    btnSearch.setVisible(true);
    pnUpper.add(btnSearch);

 }
}

これに:

public class Gui {
  private JButton btnUpdate; // make private and non-static
  public Gui() {
    // JButton btnSearch = new JButton("Search");
    //  btnSearch.setBounds(463, 112, 91, 23); // don't use absolute positioning
    //  btnSearch.setVisible(true);  // not needed

    btnUpdate = new btnUpdate("Search");
    pnUpper.add(btnSearch);
 }

 public AbstractButton getBtnUpdate() {
    return btnUpdate;
 }
}

そしてsearchDBを次から変更します:

public class searchDB{

public void searchDB(){

    HandlerClass handler = new HandlerClass();
    Gui.btnSearch.addActionListener(handler); //error in this line

}
private class HandlerClass implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent event) {
        // TODO Auto-generated method stub
        String cstmrSearch = (String) Gui.cbCustomer.getSelectedItem();
        System.out.println("Selected Customer is :"+cstmrSearch);
    }


}
}

に:

public class SearchDB{  // class names begin with upper-case

  public SearchDB(Gui gui){  // no more pseudo-constructors! And pass in Gui object
    HandlerClass handler = new HandlerClass();
    gui.getBtnUpdate().addActionListener(handler); // call method
  }

  private class HandlerClass implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent event) {
        // String cstmrSearch = (String) Gui.cbCustomer.getSelectedItem();
        String cstmrSearch = gui.getSelectedCustomer(); // give Gui this method
        System.out.println("Selected Customer is :"+cstmrSearch);
    }

  }
}

(説明については、コード内のコメントを参照してください)

于 2013-10-23T20:54:43.537 に答える
0

Class Guiandにコンストラクターを追加するつもりだった場合はClass searchDB、戻り値の型として void を追加しないでください。

void を追加すると、通常の方法になります。コンストラクターには戻り値の型がありません。また、コンストラクター内に初期化コードを含めることができ、この初期化はクラスのオブジェクトを作成するときに行われます。明示的な呼び出しを行う必要はありません。

Class Gui {

public Gui(){
 //initialization code goes here
}

}

Class searchDB{

public searchDB(){
 //initialization code goes here
}
}
于 2013-10-23T20:47:10.530 に答える