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 был разработан для использования с менеджерами по макету.
Читайте больше в:
if(customers.get(i).getSSN() == ssn)
Проблема в этой линии. Используйте метод equals() для сравнения строк вместо ==.
Если вы используете == для сравнения строк, он вернет true, если оба объекта String в памяти совпадают. Но метод equals() проверит значения этих объектов String. Так что меняется выше линии с
if(customers.get(i).getSSN().equals(ssn))
исправит вашу проблему.