[英]Error for JButton ActionListener
我在為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);
}
}
}
任何想法這個代碼中的問題是什么?
堆棧跟蹤是問題的一個很好的指標
從Gui
的構造函數中刪除void
關鍵字
public Gui() {
允許分配組件變量。 另外,在構造函數中刪除JButton
類型以確保變量不被遮蔽 :
btnSearch = new JButton("Search");
旁白: static
字段被認為是設計不佳,而是使用實例變量
如果您打算將構造函數添加到Class Gui
和Class searchDB
,則不應將void添加為返回類型。
添加void將使其成為常規方法。 構造函數沒有返回類型。 您也可以在構造函數中包含初始化代碼,並在創建類的對象時進行初始化。 無需進行任何顯式調用。
Class Gui {
public Gui(){
//initialization code goes here
}
}
Class searchDB{
public searchDB(){
//initialization code goes here
}
}
我會設計我的課程有點不同。 我同意@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);
}
}
}
(見代碼中的注釋以供解釋)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.