Переменная имеет странное поведение при использовании прослушивателя событий в JTable (Java с колебанием) - PullRequest
0 голосов
/ 23 марта 2020

Был бы очень признателен за помощь.

Короткая версия В основном я могу вызвать метод с жестко закодированной строкой в ​​качестве аргумента, но я не могу использовать одну указанную 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");
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...