Wyświetlanie danych JavaFX

0

Witam po raz kolejny, mam TableView, który wyświetla mi Imie, nazwisko i email.
Po kliknięciu na wybrany rekord z tabeli chcę by po prawej stronie (jak na zdjęciu) wyświetlały się rekordy z detalami ( imie nazwisko email login hasło i uprawnienia)

 
	private void pokazDetaleUsera() {
		
		if (tv_user.getSelectionModel().getSelectedItem() != null) {
			l_imie.setText(user.getFirstName());
			l_nazwisko.setText(user.getLastName());
			l_email.setText(user.getEmail());
			l_login.setText(user.getLogin());
			l_haslo.setText(user.getPassword());
			l_uprawnienia.setText(user.getPermissions());
		} else {
			l_imie.setText("");
			l_nazwisko.setText("");
			l_email.setText("");
			l_login.setText("");
			l_haslo.setText("");
			l_uprawnienia.setText("");
		}
	}

Niestety tak się nie dzieje, nic się nie wyświetla, ktoś może mi podpowiedzieć gdzie robię błąd? l_imie itd to są labelki

user image

0
		
pokazDetaleUsera(null);
tv_user.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> pokazDetaleUsera(newValue));

już sobie poradziłem. Jakby ktoś chciał odpowiedź na moje pytanie ^

0

Mam jeszcze jedno pytanie, ostatnie na dziś. Tamto u góry mi poszło, tak jak na zdjęciu, lecz teraz chciałbym zrobić by po przyciśnięciu przycisku otwierało się nowe okienko z uzupełnionymi TextFieldami, gdy zaznaczę jakiś rekord z tabeli to pojawiły się te dane tam, w celu edycji.

user image

Napisałem nowy kontroller, ale nie działa jak powinno, nie kopiuje danych z tabeli w pola. Jak rozwiązać ten problem ?

Kod kontrolera:

 

public class EditUserPanelController implements Initializable {

	@FXML
	private TextField tf_imie;

	@FXML
	private Button btnZapisz;

	@FXML
	private TextField tf_haslo;

	@FXML
	private ComboBox<String> cb_uprawnienia;

	@FXML
	private TextField tf_login;

	@FXML
	private TextField tf_email;

	@FXML
	private Button btnAnuluj;

	@FXML
	private TextField tf_nazwisko;

	private User userDoEdycji;

	final ObservableList<String> uprawnienia = FXCollections
			.observableArrayList("Administrator", "Kierownik", "Użytkownik");

	public User getUserDoEdycji() {
		return userDoEdycji;
	}

	public void setUserDoEdycji(User userDoEdycji) {
		this.userDoEdycji = userDoEdycji;
	}

	@Override
	public void initialize(URL location, ResourceBundle resources) {
		cb_uprawnienia.setItems(uprawnienia);
		konfigurujPrzyciski();
		User user = (User) ZmianaSceny.object;
		if (user != null) {
		tf_imie.setText(user.getFirstName());
		tf_nazwisko.setText(user.getLastName());
		tf_email.setText(user.getEmail());
		tf_login.setText(user.getLogin());
		tf_haslo.setText(user.getPassword());
		cb_uprawnienia.setValue(user.getPermissions());
		
		
	}
	}
}

0

Stwórz sobie klasę SelectedUser, która będzie miała zdefiniowane pola dla danych użytkownika i przy zaznaczeniu wiersza w tabeli uzupełniaj te pola, po czym korzystaj z ich zawartości przy kliknięciu przycisku Edytuj.

0

już piszę Twoją myśl do eclipsa, daj mi trochę czasu. :P

0

hmm tylko ja mam już podobną klasę do tego co Ty piszesz w klasie poprzedzającej zobacz.

	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {
		// TODO Auto-generated method stub
		konfigurujPrzyciski();
		konfigurujWidokTabeli();
		pokazDetaleUsera(null);
		tv_user.getSelectionModel()
				.selectedItemProperty()
				.addListener(
						(observable, oldValue, newValue) -> pokazDetaleUsera(newValue));
	}



private void pokazDetaleUsera(User user) {
		if (user != null) {
			l_imie.setText(user.getFirstName());
			l_nazwisko.setText(user.getLastName());
			l_email.setText(user.getEmail());
			l_login.setText(user.getLogin());
			l_haslo.setText(user.getPassword());
			l_uprawnienia.setText(user.getPermissions());
		} else {
			l_imie.setText("");
			l_nazwisko.setText("");
			l_email.setText("");
			l_login.setText("");
			l_haslo.setText("");
			l_uprawnienia.setText("");
		}

Tylko to uzupełnia mi Labelki tak jak na pierwszym zdjęciu. Czekaj opiszę Ci jak to wygląda z poziomu użytkownika:

Masz opcję w menuBarze edytuj użytkownika, wyświetla Ci się to co na 1 screenie u samej góry, tylko naprawione, zaznaczasz sobie którykolwiek rekord i naciskasz edytuj i pojawia się to co na drugim screenie, ale niestety bez danych. Ta metoda co jest powyżej odpowiada za uzupełnianie danych jak na screenie pierwszym tam gdzie zaznaczyłem okręgiem, a chciałbym by także ona uzupełniała mi dane w tych textfieldach, w kolejnej klasie. Jak ją wykorzystać skoro jest w osobnej klasie?

0

Zakładam, że przy naciśnięciu przycisku Edytuj tworzysz nową instancję obiektu dziedziczącego po Stage. Dodaj w konstruktorze tego obiektu parametr odpowiadający obiektowi User, po czym korzystaj z jego pól do uzupełnienia TextField'ów.

class Window extends Stage {

	private user;

	public Parent createContent() {

		/* layout i zawartość okna Twojej aplikacji */

		TextField textFieldFirstName = new TextField();
		textField.setText(user.getFirstName());

		/* ... i tak dalej... */
	}

	private Window(User user) {
		this.user = user;

		this.setScene(new Scene(createContent()));
		this.show();
	}
}
0

Pozwól, że Ci pokażę kod tych dwóch klas:
Klasa EditUserController:

public class EditUserController implements Initializable {

	@FXML
	private TableView<User> tv_user;

	@FXML
	private Label l_uprawnienia;

	@FXML
	private Button btnEdytuj;

	@FXML
	private Label l_imie;

	@FXML
	private TableColumn<?, ?> id_tc;

	@FXML
	private TableColumn<?, ?> imie_tc;

	@FXML
	private TableColumn<?, ?> email_tc;

	@FXML
	private Button btnAnuluj;

	@FXML
	private Label l_haslo;

	@FXML
	private TableColumn<?, ?> nazwisko_tc;

	@FXML
	private Label l_login;

	@FXML
	private Label l_email;

	@FXML
	private Label l_nazwisko;

	public TableView<User> getTv_user() {
		return tv_user;
	}

	public void setTv_user(TableView<User> tv_user) {
		this.tv_user = tv_user;
	}

	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {
		// TODO Auto-generated method stub
		konfigurujPrzyciski();
		konfigurujWidokTabeli();
		pokazDetaleUsera(null);
		tv_user.getSelectionModel()
				.selectedItemProperty()
				.addListener(
						(observable, oldValue, newValue) -> pokazDetaleUsera(newValue));
	}

	public TableView<User> getTableViewUser() {
		return tv_user;
	}

	public void konfigurujWidokTabeli() {
		id_tc.setCellValueFactory(new PropertyValueFactory<>("idUser"));
		imie_tc.setCellValueFactory(new PropertyValueFactory<>("firstName"));
		nazwisko_tc.setCellValueFactory(new PropertyValueFactory<>("lastName"));
		email_tc.setCellValueFactory(new PropertyValueFactory<>("email"));

		tv_user.setEditable(true);
		zaladujUserDotabeli();
	}

	public void zaladujUserDotabeli() {
		DostepUser dbUser = new DostepUser();
		ObservableList<User> listaUser = FXCollections
				.observableArrayList(dbUser.pobierzWszystkichUser());
		tv_user.setItems(listaUser);
	}

	private void pokazDetaleUsera(User user) {
		if (user != null) {
			l_imie.setText(user.getFirstName());
			l_nazwisko.setText(user.getLastName());
			l_email.setText(user.getEmail());
			l_login.setText(user.getLogin());
			l_haslo.setText(user.getPassword());
			l_uprawnienia.setText(user.getPermissions());
		} else {
			l_imie.setText("");
			l_nazwisko.setText("");
			l_email.setText("");
			l_login.setText("");
			l_haslo.setText("");
			l_uprawnienia.setText("");
		}
	}

	public void konfigurujPrzyciski() {
		btnEdytuj.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				ZmianaSceny zs = new ZmianaSceny();
				zs.zmianaSceny("/EditUserPane.fxml", "Edit user");
			}
		});
	}
}

Klasa EditUserPanelController(to okienko z txtfieldami):

public class EditUserPanelController implements Initializable {

	@FXML
	private TextField tf_imie;

	@FXML
	private Button btnZapisz;

	@FXML
	private TextField tf_haslo;

	@FXML
	private ComboBox<String> cb_uprawnienia;

	@FXML
	private TextField tf_login;

	@FXML
	private TextField tf_email;

	@FXML
	private Button btnAnuluj;

	@FXML
	private TextField tf_nazwisko;

	private User userDoEdycji;

	final ObservableList<String> uprawnienia = FXCollections
			.observableArrayList("Administrator", "Kierownik", "Użytkownik");

	public User getUserDoEdycji() {
		return userDoEdycji;
	}

	public void setUserDoEdycji(User userDoEdycji) {
		this.userDoEdycji = userDoEdycji;
	}

	@Override
	public void initialize(URL location, ResourceBundle resources) {
		cb_uprawnienia.setItems(uprawnienia);
		konfigurujPrzyciski();
		
//TUTAJ GDZIEŚ JEST PROBLEM
                User user = (User) ZmianaSceny.object;
		if (user != null) {
		tf_imie.setText(user.getFirstName());
		tf_nazwisko.setText(user.getLastName());
		tf_email.setText(user.getEmail());
		tf_login.setText(user.getLogin());
		tf_haslo.setText(user.getPassword());
		cb_uprawnienia.setValue(user.getPermissions());	
	}
	}
	public void konfigurujPrzyciski() {
		btnZapisz.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				ZmianaSceny zs = new ZmianaSceny();
				zs.zmianaSceny("/FXMLAddUser.fxml", "Add user");
			}
		});
	}
}
0

Mam coś takiego aktualnie.
Klasa EditUserController:

	public void pokazDetaleUsera(User user) {
		if (user != null) {
			l_imie.setText(user.getFirstName());
			l_nazwisko.setText(user.getLastName());
			l_email.setText(user.getEmail());
			l_login.setText(user.getLogin());
			l_haslo.setText(user.getPassword());
			l_uprawnienia.setText(user.getPermissions());

		} else {
			l_imie.setText("");
			l_nazwisko.setText("");
			l_email.setText("");
			l_login.setText("");
			l_haslo.setText("");
			l_uprawnienia.setText("");
			selectedItems();
		}
	}

	public void selectedItems() {
		tv_user.getSelectionModel()
				.selectedItemProperty()
				.addListener(
						(observable, oldValue, newValue) -> pokazDetaleUsera(newValue));
	}
 

Klasa EditUserPanelController:

 
	public void daneDoTextFieldow(User user) {
		
		if (user != null) {
			tf_imie.setText(user.getFirstName());
			tf_nazwisko.setText(user.getLastName());
			tf_email.setText(user.getEmail());
			tf_login.setText(user.getLogin());
			tf_haslo.setText(user.getPassword());
			cb_uprawnienia.setValue(user.getPermissions());
		} else {
			tf_imie.setText("");
			tf_nazwisko.setText("");
			tf_email.setText("");
			tf_login.setText("");
			tf_haslo.setText("");
			cb_uprawnienia.setValue("");
			System.out.println("test");
		}
	}

i jak teraz metodę selectedItems() zaaplikować do metody daneDoTextFieldow() ??

1

a jakbyś do obsługi przycisku edytuj dał takie coś?

try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/FXMLAddUser.fxml"));
            Parent root = loader.load();
            Stage dialogStage = new Stage();
            EditUserController controller = loader.getController();
            dialogStage.initModality(Modality.WINDOW_MODAL);
            User user=(User)tv_user.getSelectionModel().getSelectedItem();
            controller.daneDoTextFieldow(user);
            Scene scene = new Scene(root);
            dialogStage.setScene(scene);
            dialogStage.showAndWait();
        } catch (IOException ex) {
            Logger.getLogger(AdminProjectViewController.class.getName()).log(Level.SEVERE, null, ex);
        }
0

user image

Dzięki wielkie :)

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