Java JTextField не будет работать при вызове метода из внутреннего класса

Я строю графический интерфейс и пытаюсь реализовать очень простой поиск - когда вы вводите SSN, он проверяет, есть ли клиент с этим SSN. У меня есть JTextField, где вводится SSN, и когда вы нажимаете кнопку отправить, он вызывает метод searchBySSNString и возвращает значение true или false. Проблема в том, что всякий раз, когда я извлекаю текст из JTextField, он возвращает false.

Ради этого вопроса я попытался свести это к как можно меньшему количеству кода, чтобы кому-то не пришлось разбираться со всем моим кодом. У меня есть дополнительный код, включенный в проблемную часть, чтобы показать, через что я работал. Если я жестко закодирую строку и ищу ее, она возвращает true, и если я сравниваю эту жестко закодированную строку с текстом из JTextField, она возвращает 0, если набран тот же текст.

Несколько разных заметок: я использую SSN в качестве строки, потому что я не думаю, что мне когда-либо придется манипулировать им, как будто это число. Если это плохая идея, я хотел бы знать, почему. SSN для созданной учетной записи - 222222222. У меня нет ничего реализованного для проверки ввода или учета тире или чего-либо еще.

Как вы увидите, если вы на самом деле пробираетесь через мой код, я довольно новичок, поэтому я всегда готов выслушать любые советы, которые есть у кого-то, но сейчас насущной проблемой является выяснение того, почему ввод из JTextField не будет работа в поиске.

import java.util.ArrayList;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;

public class Bank {

    private JFrame frame;
    private JTextField txtSearchBySSN;
    private JTextField txtTestMessage;
    static ConnectionFactory connectionFactory = ConnectionFactory.getConnectionFactory();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        connectionFactory.newAccountAndCustomer("Mike", "222222222");

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Bank window = new Bank();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Bank() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 607, 429);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JLabel lblSearchBySSN = new JLabel("Search for customer by SSN");
        lblSearchBySSN.setBounds(6, 38, 190, 16);
        frame.getContentPane().add(lblSearchBySSN);

        txtSearchBySSN = new JTextField();
        txtSearchBySSN.setBounds(208, 32, 134, 28);
        frame.getContentPane().add(txtSearchBySSN);
        txtSearchBySSN.setColumns(10);

        //here's the problem portion
        JButton btnSearchBySSN = new JButton("Search");
        btnSearchBySSN.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //get text from the textbox
                String testString = txtSearchBySSN.getText();
                //print out the text from the textbox to see if it looks the same
                System.out.println(testString);
                //call the search method using the string from the textbox
                System.out.println(connectionFactory.searchBySSNString(testString));
                //call the search method using two hard-coded string to see if the method works
                //one that does match and one that doesnt
                System.out.println(connectionFactory.searchBySSNString("222222222"));
                System.out.println(connectionFactory.searchBySSNString("333333333"));
                //compare the text from the textbox to a hard-coded string - this returns 0
                System.out.println(testString.compareTo("222222222"));
            }
        });
        btnSearchBySSN.setBounds(355, 33, 117, 29);
        frame.getContentPane().add(btnSearchBySSN);

        txtTestMessage = new JTextField();
        txtTestMessage.setBounds(117, 83, 134, 28);
        frame.getContentPane().add(txtTestMessage);
        txtTestMessage.setColumns(10);
    }
}

class ConnectionFactory {
    private ArrayList<Customer> customers;
    private ArrayList<Account> accounts;
    private ArrayList<Connection> connections;
    private static ConnectionFactory connectionFactory;

    private ConnectionFactory() {
        customers = new ArrayList<Customer>();
        accounts = new ArrayList<Account>();
        connections = new ArrayList<Connection>();
    }

    //creates a ConnectionFactory if one doesn't already exist
    public static ConnectionFactory getConnectionFactory() {
        if (connectionFactory == null) {
            connectionFactory = new ConnectionFactory();
        }
        return connectionFactory;
    }

    //create new account and new customer
    public void newAccountAndCustomer(String customerName, String ssn) {
        Customer customer = new Customer(customerName, ssn);
        Account account = new CheckingAccount();

        //create the connection object, add all of the items to their respective arrays
        Connection connection = new Connection(customer, account);
        customers.add(customer);
        accounts.add(account);
        connections.add(connection);
    }

    //check to see if customer exists
    public String searchBySSNString(String ssn) {
        boolean customerExists = false;

        for(int i = 0; i < customers.size(); i++) {
            if(customers.get(i).getSSN() == ssn) {
                customerExists = true;
                break;
            }
        }
        if (customerExists) {
            return "true";
        }
        else {
            return "false";
        }
    }
}

abstract class Account {
    private long accountNumber;
    private double currentBalance;

    protected Account() {
        //
    }

    protected Account(double currentBalance) {
        this.currentBalance = currentBalance;
    }

    public void withdraw(double withdrawalAmount) {
        currentBalance -= withdrawalAmount;
    }

    public void deposit(double depositAmount) {
        currentBalance += depositAmount;
    }

    public double getCurrentBalance() {
        return currentBalance;
    }

    public void setCurrentBalance(double newBalance) {
        this.currentBalance = newBalance;
    }

    public long getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(long accountNumber) {
        this.accountNumber = accountNumber;
    }
}

class CheckingAccount extends Account {
    private double overdraftAmount;
    private static long nextAccountNumber = 10000000;
    private long accountNumber;

    public CheckingAccount() {
        accountNumber = nextAccountNumber;
        nextAccountNumber++;
    }

    public void setOverdraftAmount(double overdraftAmount) {
        this.overdraftAmount = overdraftAmount;
    }

    public double getOverdraftAmount() {
        return overdraftAmount;
    }

    public long getAccountNumber() {
        return accountNumber;
    }

    @Override
    public String toString() {
        return String.valueOf(accountNumber);
    }
}

class Connection {
    private Customer customer;
    private Account account;

    public Connection(Customer customer, Account account) {
        this.customer = customer;
        this.account = account;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public Account getAccount() {
        return account;
    }   
}

class Customer {
    private String name;
    private String ssn;

    public Customer(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setSSN(String ssn) {
        this.ssn = ssn;
    }

    public String getSSN() {
        return ssn;
    }

    @Override
    public String toString() {
        return name;
    }
}

2 ответа

Решение

На самом деле я не читаю весь ваш код, но вы сравниваете наблюдательное равенство между объектами в Java с equals метод, == это просто ссылочное равенство. Так

Изменить:

if(customers.get(i).getSSN() == ssn)

в

if(customers.get(i).getSSN().equals(ssn))

Также не используйте null раскладка. Swing был разработан для использования с менеджерами по макету.

Читайте больше в:

Как сравнить строки в Java

Использование менеджеров по расположению

if(customers.get(i).getSSN() == ssn)

Проблема в этой линии. Используйте метод equals() для сравнения строк вместо ==.

Если вы используете == для сравнения строк, он вернет true, если оба объекта String в памяти совпадают. Но метод equals() проверит значения этих объектов String. Так что меняется выше линии с

if(customers.get(i).getSSN().equals(ssn))

исправит вашу проблему.

Другие вопросы по тегам