Java JButton ActionListener的错误
我在为JButton添加ActionListener时遇到问题,请帮助解决此问题 错误:Java JButton ActionListener的错误,java,swing,jbutton,actionlistener,Java,Swing,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
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
类型,以确保变量不是:
旁白:静态
字段被认为是糟糕的设计,请改用实例变量如果您打算将构造函数添加到类Gui
和类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
}
}
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;
}
}
从以下位置更改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 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 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);
}
}
}
致:
(请参见代码中的注释以获取解释)谢谢大家的回答,这真的很有帮助。