Был бы очень признателен за помощь.
Короткая версия В основном я могу вызвать метод с жестко закодированной строкой в качестве аргумента, но я не могу использовать одну указанную c глобальную строковую переменную (хотя я могу распечатать его и проверить, что это строка, и она распознается)
Длинная версия: Поэтому я пытаюсь заставить функцию работать на базовом уровне * Приложение банка 1028 *, и это сводит меня с ума.
У меня есть классы для логики c банка, клиентов и счетов. Это работает как задумано. Проблема заключается в классе Gui.
Я использую JTable, чтобы показать список клиентов. У каждого клиента есть личный номер, который я храню в глобальной переменной. Я использую эту переменную в качестве аргумента для методов, которые я вызываю. Например, bank.findCustomer (personalNumber).
Я могу печатать текущий выбранный персональный номер каждый раз, когда нажимаю на строку в таблице. Это прекрасно работает. Я проверил, что это действительно строка. Но как только я создаю объект Customer для изменения имени (используя метод из класса customer), я не могу использовать глобальную переменную выбранного личного номера.
Кажется настолько странным, что я могу жестко закодировать строку, но не могу передать строку переменной.
Я предполагаю, что строка каким-то образом "заблокирована" в синхронном режиме (?) событие или что даже слушатели находятся в конфликте. Я пробовал 1000 разных вещей, чтобы заставить его работать. Такое ощущение, что я бьюсь головой о стену ...
Я получаю исключение нулевого указателя при попытке вызвать customer.setName () внутри метода actionPerformed. Если я использую это вне этого метода, это работает?
Вот код:
class Gui implements ActionListener {
private BankLogic bank;
private JFrame frame;
protected JTable table;
protected JMenuBar menuBar;
protected JMenu mainMenu, customerMenu, accountMenu;
protected JPopupMenu popupMenu;
protected JMenuItem addCustomerItem, removeCustomerItem, editCustomerItem, showCustomersItem,
createSavingsAccountItem, createCreditAccountItem, showAccountsItem,
removeAccountItem, depositToAccountItem;
protected JButton refreshButton;
protected DefaultTableModel defModel;
String pNumOfCustomerSelected;
protected int accNumOfAccountSelected;
private JScrollPane scroll;
private ArrayList<String> customerDataList;
protected String test = "14";
Gui() {
bank = new BankLogic();
// dummy customers
bank.createCustomer("Donald", "Duck", "12");
bank.createCustomer("Dauda", "Dabo", "14");
bank.createSavingsAccount("12");
bank.createCreditAccount("12");
// for testing
pNumOfCustomerSelected = "12";
// === MAIN MENU === //
// Item for menu
addCustomerItem = new JMenuItem("Add customer");
addCustomerItem.addActionListener(this);
// Menu to hold items
mainMenu = new JMenu("Menu");
// Menu bar to hold menu
menuBar = new JMenuBar();
// Install components
mainMenu.add(addCustomerItem);
menuBar.add(mainMenu);
// === POPUP MENU === //
// Items for popup menu
editCustomerItem = new JMenuItem("Edit customer name(s)");
editCustomerItem.addActionListener(this);
// Popup menu
popupMenu = new JPopupMenu();
// Install compeonents
popupMenu.add(editCustomerItem);
// === TABLE === //
// Model for table
defModel = new DefaultTableModel();
defModel.addColumn("First name");
defModel.addColumn("Last name");
defModel.addColumn("Personal number");
// Table
table = new JTable(defModel);
fillTable();
// Scroll feature for table
scroll = new JScrollPane(table);
// refresh button
refreshButton = new JButton("Refresh");
refreshButton.addActionListener(this);
// Install popup menu
table.setComponentPopupMenu(popupMenu);
// Install mouse listener
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent me) {
pNumOfCustomerSelected = (String) table.getValueAt(table.getSelectedRow(), 2);
System.out.println(pNumOfCustomerSelected); // works fine
}
});
// === MAIN FRAME === //
// Main frame
frame = new JFrame("Bank application");
// Layout for frame
frame.setLayout(new BorderLayout());
// Install components to frame
frame.add(scroll, BorderLayout.CENTER);
frame.add(refreshButton, BorderLayout.SOUTH);
frame.setJMenuBar(menuBar);
// Settings for main frame
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* Fills the customer table with data
*/
public void fillTable(){
customerDataList = bank.getAllCustomers();
// Filling the table with rows (of customer info)
for(int i = 0; i < customerDataList.size(); i++){
String customerInfo = customerDataList.get(i);
String[] customerInfoComponents = splitString(customerInfo);
Vector row = new Vector();
row.add(customerInfoComponents[0]);
row.add(customerInfoComponents[1]);
row.add(customerInfoComponents[2]);
defModel.addRow(row);
}
}
/**
* Clears the table rows
*/
public void clearTable(){
int rowCount = defModel.getRowCount();
if(rowCount > 0) {
for (int i = 0; i < rowCount; i++) {
defModel.removeRow(0);
}
}
}
/**
*
* @param stringForProcess customer info
* @return an array of the words in the string (separated by " ")
*/
String[] splitString(String stringForProcess){
return stringForProcess.split("\\s+");
}
// action listener
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == addCustomerItem)
new AddCustomerWindow(bank, "Add customer");
else if(e.getSource() == refreshButton){
clearTable();
fillTable();
}
else if(e.getSource() == editCustomerItem){
Customer cust = bank.findCustomer(pNumOfCustomerSelected);
// Customer customer = bank.findCustomer("12"); // This works fine???
customer.setName("name"); // nullpointer
customer.setSurName("surname");
}
}
}