2013-10-23 60 views
0

我在为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); 
    } 


} 
} 

任何想法这个代码中有什么问题?

+0

谢谢大家的答案,这是真的很有帮助。 –

回答

0

我会设计我的类有点不同。我同意@Reimeus,你应该避免错误使用静态字段,并且你应该避免使用void返回类型的“伪”构造函数,构造函数,因为构造函数应该没有返回类型。从这个

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 
    } 
} 

更改桂:

具体来说,我会改变这样的:

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 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); 
    } 

    } 
} 

(见代码的解释注释)

2

的堆栈跟踪是问题的良好指标

从构造中删除的Gui

public Gui() { 

void关键字,以允许分配组件变量。另外除去JButton类型的构造函数来确保变量没有被shadowed

btnSearch = new JButton("Search"); 

旁白:static领域被认为是不良设计,使用实例变量,而不是

0

如果你打算添加构造到Class GuiClass searchDB,你不应该添加void作为返回类型。

添加void将使其成为一种常规方法。构造函数将没有返回类型。你也可以在构造函数中有初始化代码,并且在创建类的对象时进行初始化。无需进行任何明确的调用。

Class Gui { 

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

} 

Class searchDB{ 

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