[英]Getting NullPointerException when accessing spinner of another class
[英]NullPointerException when accessing another class in ActionListener
我试图以一种标准方式向JButton添加ActionListener:在方法之外,我有private Actions listener;
在我已经放入的方法中
listener = new Actions(); // Create the action listener object
// Add action listeners to the necessary components
isDatabaseDefault.addActionListener(listener);
addEntry.addActionListener(listener);
editEntry.addActionListener(listener);
deleteEntry.addActionListener(listener);
addDatabase.addActionListener(listener);
editDatabase.addActionListener(listener);
deleteDatabase.addActionListener(listener);
并且运行正常,没有发现错误-这是ActionListener类:
package engines;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import graphicalUI.Tabs;
public class Actions implements ActionListener, SoftwareProperties{
// Create objects to access methods
private DatabaseManagement database;
private Tabs tabs;
public Actions(){
this.database = new DatabaseManagement();
this.tabs = new Tabs();
}
// Method that is called when a button is clicked
public void actionPerformed(ActionEvent e) {
// Check the source of the action
if(e.getActionCommand().equals("Make a new database")){
System.out.println("Null pointer exception");
String location = database.makeNewDatabase();
if(location==null){
JOptionPane.showMessageDialog(null, "Error: Your new database was not successfully created. Please try again if you like.", applicationName, JOptionPane.WARNING_MESSAGE);
return;
}
tabs.updateDatabaseMCombo();
tabs.setDatabaseManagementContent(location, true);
}
}
}
当我按下按钮时,尽管会输出“ Null Pointer Exception”,并且出现了database.makeNewDatabase();
运行,但是一旦它进入tabs类中的任何一个方法,我就会收到以下错误:
javax.swing.AbstractButton.fireActionPerformed()上engine.Actions.actionPerformed(Actions.java:31)上图形UI.Tabs.updateDatabaseMCombo(Tabs.java:148)上的线程“ AWT-EventQueue-0”中的java.lang.NullPointerException异常javax.swing.DefaultButtonModel.setPressed中的javax.swing.DefaultButtonModel.fireActionPerformed(未知源)处的javax.swing.DefaultButtonModel.setPressed(未知源)处的javax.swing.plaf.basic中的Unknown Source)。 java.awt.AWTEvent中的BasicButtonListener.mouseReleased(未知源)AWTEventMulticaster.mouseReleased(未知源)在java.awt.Component.processMouseEvent(未知源)在javax.swing.JComponent.processMouseEvent(java.awt.Component中。 java.awt.Container.dispatchEventImpl(未知源)java.awt.Component.dispatchEventImpl(java.awt.Component.dispatchEventImpl(未知源)java.awt.Component.dispatchEventImpl(未知源)未知源),位于java.awt.LightweightDispatcher.r java.awt.LightweightDispatcher.processMouseEvent(未知源)的etargetMouseEvent(未知源)java.awt.Container.dispatchatchEventImpl(java.awt.Container.dispatchEventImpl(未知源)的java.awt.LightweightDispatcher.dispatchEvent(未知源)未知源)java.awt.Component.dispatchEvent(未知源)java.awt.EventQueue.dispatchEventImpl(未知源)java.awt.EventQueue.access $ 000(未知源)java.awt.EventQueue $ 3.run( java.awt.EventQueue $ 3.run中的Unknown Source)(java.security.AccessController.doPrivileged(本机方法)处的java.security.ProtectionDomain $ 1.doIntersectionPrivilege(本机方法)处的java.security.ProtectionDomain $ 1.doIntersectionPrivilege的未知源) (未知源)在java.awt.EventQueue $ 4.run(未知源)在java.awt.EventQueue $ 4.run(在java.security.AccessController.doPrivileged(本地方法)在java.security.ProtectionDomain $ 1。 java.awt.EventQueue.dispatchEve上的doIntersectionPrivilege(未知源) nt(未知源)(java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) java.awt.EventDispatchThread.pumpEvents(源未知)(java.awt.EventDispatchThread.run中的未知源)
但是奇怪的是,当我在同一个类中运行这些方法时,它们可以完美地工作! 这是updateDatabaseMCombo()
方法:
public void updateDatabaseMCombo(){
System.out.println("is this method running");
int sIndex = selectDatabase.getSelectedIndex(); // Get the number value of the selected item
String selectedItem = selectDatabase.getItemAt(sIndex); // Get the string of the selected item
System.out.println(selectedItem);
availableDBs4DM = db.getAvailableDatabases4DB(null); // Get a list of available databases to manage
selectDatabase.removeAllItems(); // Remove all the current items in the combo
// Loop through the array and manually add each item
for(String item : availableDBs4DM)
selectDatabase.addItem(item);
// Select the item that was previously selected
int search = -1; // Initialise variable to hold the search results
for(int s = 0; s < availableDBs4DM.length; s++){
// If a match is found, update the search variable and stop searching
if(availableDBs4DM[s].equals(selectedItem)){
search = s;
break;
}
}
if(search != -1){
// If the database that was previously selected is still in the JCombobox
selectDatabase.setSelectedIndex(search);
}else{
// Select the default database
db.setTranslationDefaultDB(selectDatabase);
}
}
那么谁能弄清楚为什么我会收到此错误?
顺便说一句, selectDatabase
已经被初始化为JComboBox<String>
对象。
更新
好的,经过一些调试之后,我发现NullPointerException是因为我只在方法的外部声明了变量,就像private JComboBox<String> selectDatabase;
我实际上是用另一种方法来初始化它,如下所示:
package test;
import java.awt.FlowLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import test2.Runner;
public class DBCombo {
private JComboBox<String> combo = new JComboBox<String>();
public JPanel makePanel(){
JPanel panel = new JPanel(new FlowLayout());
String[] options = {"Why", "will", "this", "not", "work"};
combo.setModel(new DefaultComboBoxModel<String>(options));
panel.add(combo);
Runner main = new Runner();
JButton doRead = new JButton("Read");
doRead.addActionListener(main);
panel.add(doRead);
return panel;
}
public void getComboData(){
System.out.println(combo.getItemCount());
}
}
package test2;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import test.DBCombo;
public class Runner implements ActionListener {
public static void main(String[] args){
JFrame frame = new JFrame("Test");
DBCombo dbc = new DBCombo();
frame.setContentPane(dbc.makePanel());
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e){
new DBCombo().getComboData();
}
}
有个主意吗?
我现在认为这是因为动作侦听器和方法位于不同的程序包中...
好的,不幸的是,这并不是我的初衷或想做的,但是至少我现在可以使它正常工作了!
事实证明,由于某种原因,我仍然不知道,除Tabs
类本身之外的任何其他类updateDatabaseMCombo()
称为updateDatabaseMCombo()
或setDatabaseManagementContent(String, boolean)
生成空指针! 所以,我只是硬着头皮,将actionlistener放在Tabs
类中...
哦,好吧,这并不是说我的最终用户会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.