Problem z metodą JTextField.getText()

0

Witam
Chciałem napisać prosty program okienkowy z dwoma przyciskami. W pola tekstowe wpisuje się imię i nazwisko, a następnie dzięki pierwszemu przyciskowi program umieszcza te informacje w bazie danych i drukuje w konsoli wprowadzoną pozycję. Drugi przycisk wyświetla zawartość całej bazy w konsoli. Jednak po kliknięciu przycisku, zamiast wprowadzenia wpisanego tekstu do bazy danych, dodawane są puste pola. W przypadku gdy zastąpię metodę getText() jakimś Stringiem, wtedy ten zostanie poprawnie umieszczony w bazie danych. W innym wypadku, jeżeli wcześniej wywołam na polu tekstowym metodę setText("Jakiś String") wtedy ustawiony tekst też trafia do bazy. Wydaje mi się, że program widzi wcześniej zainicjowane pola, jednak nie wyłapuje zmian w trakcie swojego działania.

public class FrameDB extends JFrame{

public FrameDB(){
	
	JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
	JButton addButton = new JButton("Add");
	JButton seeButton = new JButton("Show");
	JPanel fieldPanel = new JPanel(new GridLayout(2, 2));
	JPanel initPanel = new JPanel(new BorderLayout());
	JTextField fNameField = new JTextField(20);
	JTextField lNameField = new JTextField(20);
	JTextArea baseView = new JTextArea(10, 20);
	JScrollPane scrollView = new JScrollPane(baseView);
	JLabel fLabel = new JLabel("First Name", JLabel.RIGHT);
	JLabel lLabel = new JLabel("Last Name", JLabel.RIGHT);
	
	//tutaj mam problem.
	addButton.addActionListener(new AddAction(fNameField.getText(), lNameField.getText()));
	seeButton.addActionListener(new SeeAction());
	panel.add(addButton);
	panel.add(seeButton);
	
	add(panel, BorderLayout.SOUTH);
	
	fieldPanel.add(fLabel);
	fieldPanel.add(fNameField);
	fieldPanel.add(lLabel);
	fieldPanel.add(lNameField);
	initPanel.add(fieldPanel, BorderLayout.NORTH);
	initPanel.add(scrollView, BorderLayout.CENTER);
	
	add(initPanel, BorderLayout.NORTH);
	
}

public class AddAction extends AbstractAction{
	
	public AddAction(String fName, String lName){
	
	putValue("firstName", fName);
	putValue("lastName", lName);
	}
	public void actionPerformed(ActionEvent event){

		String fName = (String) getValue("firstName");
		String lName = (String) getValue("lastName");
		AccesDB.addPerson(fName, lName);
	}
}
public class SeeAction extends AbstractAction{
	
	public void actionPerformed(ActionEvent event){
		
		AccesDB.seePerson();
	}
}

}

public class AccesDB {

static final String JDBC_DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
static final String DB_URL = "jdbc:derby:C:\\Users\\Name\\MyDB";

static final String USER = "Name";
static final String PASS = "aaa";

public static void addPerson(String firstName, String lastName){
	
	try{
		Class.forName(JDBC_DRIVER);
		Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
		Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
		ResultSet rs = stat.executeQuery("SELECT * FROM Sample.Person");
		rs.moveToInsertRow();
		rs.updateString("firstName", firstName);
		rs.updateString("lastName", lastName);
		rs.insertRow();
		rs.moveToCurrentRow();
		rs.close();
		stat.close();
		conn.close();
	
	}catch(SQLException | ClassNotFoundException e){
		e.printStackTrace();
	}
	System.out.println("Nowa osoba dodana: " + firstName + " " + lastName);
}
public static void seePerson(){
	
	int count = 0;
	try{
		Class.forName(JDBC_DRIVER);
		Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
		Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
		ResultSet rs = stat.executeQuery("SELECT * FROM Sample.Person");
		System.out.println("Osoby na liście: ");
		while(rs.next()){
			count++;
			String firstName = rs.getString("firstName");
			String lastName = rs.getString("lastName");
			System.out.println(count + ". " + firstName + " " + lastName);
		}
		rs.close();
		stat.close();
		conn.close();
		
	}catch(SQLException | ClassNotFoundException e){
		e.printStackTrace();
	}
}

}

1

Do klasy AddAction przekazujesz aktualną zawartość pól tekstowych, żadne działania użytkownika tego nie zmienią.
Zrób coś takiego

public class AddAction extends AbstractAction{
    JTextField tfName;
    JTextField tfLastName;
    public AddAction(JTextField tfName, JTextField tfLastName){

         this.tfName = tfName;
         this.tfLastName = tfLastName;

    }
    public void actionPerformed(ActionEvent event){
        AccesDB.addPerson(tfName.getText(), tfLastName.getText());
    }
}
0

Teraz widzę. Przekazywałem początkową wartość pól tekstowych. Dzięki wielkie za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1