Я пытаюсь добавить ActionListener в JButton стандартным способом: вне метода, который у меня есть 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();
запускается, но как только он добирается до любого изметоды внутри класса вкладок, я получаю следующую ошибку:
Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException в graphicalUI.Tabs.updateDatabaseMCombo (Tabs.java:148)в Engine.Actions.actionPerformed (Actions.java:31) в javax.swing.AbstractButton.fireActionPerformed (Неизвестный источник) в javax.swing.AbstractButton $ Handler.actionPerformed (Неизвестный источник) в javax.swing.DefaultButtonModel.fireAknownfor) в javax.swing.DefaultButtonModel.setPressed (Неизвестный источник) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased (Неизвестный источник)на java.awt.AWTEventMulticaster.mouseReleased (неизвестный источник) на java.awt.Component.processMouseEvent (неизвестный источник) на javax.swing.JComponent.processMouseEvent (неизвестный источник) на java.awt.Component.processEvent (неизвестный источник на java.awt.Container.processEvent (Неизвестный источник) в java.awt.Component.dispatchEventImpl (Неизвестный источник) в java.awt.Container.dispatchEventImpl (Неизвестный источник) в java.awt.Component.dispatchEvent (Неизвестный источник) в java.awt.LightweightDispatcher.retargetMouseEvent (Unknown Source) в java.awt.LightweightDispatcher.processMouseEvent (Unknown Source) в java.awt.LightweightDispatcher.dispatchEvent (Unknown Source) в java.awt.Container.dispatchEventImpl (Unknown Source) в java.awt.Window.dispatchEventImpl (неизвестный источник) в java.awt.Component.dispatchEvent (неизвестный источник) в java.awt.EventQueue.dispatchEventImpl (неизвестный источник) в java.awt.EventQueue.access $ 000 (неизвестный источник) в java.awuet.vent 3.run (Неизвестный источник) на java.awt.EventQueue $ 3.run (Неизвестный источникe) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (неизвестный источник) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (неизвестный источник) в java.awt.Runue ($).Неизвестный источник) в java.awt.EventQueue $ 4.run (Неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (Неизвестный источник) в java.awt.EventQueue.disatchНеизвестный источник) в java.awt.EventDispatchThread.pumpOneEventForFilters (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForFilter (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy (Неизвестный источник.Прив.) в 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>
object.
UPDATE
Хорошо, после некоторой отладки я обнаружил, что мое исключение 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();
}
}
Кто-нибудь есть идея?
Теперь я думаю, что это потому, что слушатель действия и метод находятся вразные пакеты ...