• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pierwsze kroki z Java oraz JavaFX

0 głosów
611 wizyt
pytanie zadane 28 sierpnia 2020 w Java przez Kacper Sas Dyskutant (8,460 p.)

Poznając Jave stwierdziłem, że dobrym pomysłem byłoby również liźnięcie JavaFX. Na start zacząłem od małego projektu, okienka logowania ze sprawdzeniem danych, które mieszczą się w .txt

 

Klasa MainWindow: (ew. pastebin)

package sas.kacper.itemsapp;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.xml.bind.DatatypeConverter;

import javafx.application.Application;

import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.PasswordField;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.scene.Node;
import javafx.scene.text.Text;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

import javafx.stage.Stage;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;

import javafx.geometry.Pos;

import sas.kacper.itemsapp.LoginAuthenticator;

public class MainWindow extends Application {
	
	@Override
	public void start(Stage primaryStage) {
		
		VBox mainPane = new VBox(10);
		
		Image iLogo = new Image("file:java.png", true);
		ImageView ivLogo = new ImageView();
		ivLogo.setImage(iLogo);
		
		Text lText = new Text("Nazwa użytkownika");
		Text pText = new Text("Hasło");
		TextField lField = new TextField();
		PasswordField pField = new PasswordField();
		Button bLogin = new Button("Log In!");
		
		bLogin.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent e) {
				String userLogin="", userHash="";
				userLogin = lField.getText();
				
				try {
					MessageDigest crypt = MessageDigest.getInstance("MD5");
					crypt.update((pField.getText()).getBytes());
					userHash = (DatatypeConverter.printHexBinary(crypt.digest())).toLowerCase();
				} catch(NoSuchAlgorithmException exc) {
					exc.printStackTrace();
				}
				
				Alert aAlert = new Alert(AlertType.INFORMATION);
				((Stage)aAlert.getDialogPane().getScene().getWindow()).getIcons().add(new Image("file:java.png"));
				aAlert.setContentText("Wszystko ok!");
				aAlert.setTitle("Zalogowany!");
				
				if(!(LoginAuthenticator.checkLogin(userLogin, userHash))) {
					aAlert.setAlertType(AlertType.ERROR);
					aAlert.setContentText("Coś poszło nie tak!");
					aAlert.setTitle("Błąd");
				}
				
				aAlert.setHeaderText(null);
				aAlert.showAndWait();
				
			}
		});
		
		lField.setMaxWidth(250);
		pField.setMaxWidth(250);
		lField.setAlignment(Pos.CENTER);
		pField.setAlignment(Pos.CENTER);
		
		mainPane.setAlignment(Pos.CENTER);
		mainPane.setStyle("-fx-background-color: #FFFFFF;");
		mainPane.getChildren().addAll(ivLogo, new Text(), new Text(), lText, lField, pText, pField, new Text(), bLogin);
		
		Scene mainScene = new Scene(mainPane, 450, 600);
		
		primaryStage.setTitle("Log In!");
		primaryStage.setResizable(false);
		primaryStage.setScene(mainScene);
		primaryStage.getIcons().add(new Image("file:java.png")); 
		primaryStage.show();
		
	}
	
	public static void main(String ... args) {
		launch(args);
	}

}

Klasa LoginAuthenticator: (ew. pastebin)

package sas.kacper.itemsapp;

import java.lang.String;

import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;

public class LoginAuthenticator {
	
	public static Boolean checkLogin(String Login, String hashPass) {
		
		BufferedReader strFile = null;
		
		try {
			strFile = new BufferedReader(new FileReader("input.txt"));
		} catch(FileNotFoundException e) {
			e.printStackTrace();
		}
		
		String sLine = null;
		
		try {
			while((sLine = strFile.readLine()) != null) {
				String[] data = sLine.split(":");
				if(data[0].equals(Login)) {
					if(data[1].equals(hashPass)) {
						return true;
					}
				}
			}
		} catch(IOException e) {
			e.printStackTrace();
		}
		
		return false;
		
	}

}

Mam parę wątpliwości. Czy nie lepiej byłoby pozostawić w klasie MainWindow tylko i wyłącznie kod związany z widokiem? Może zamiast działać na klasie LoginAuthenticator to utworzyć obiekt, konstruktorem podesłać dane, potem wywołać metodę checkLogin i również z niej informować o rezultacie?

Jak to na początki przystało, MainWindow razi po oczach bałaganem. Jakieś wskazówki? Na co zwracać uwagę, czego nie robić? Za wszystkie podpowiedzi byłbym wdzięczny. Pozdrawiam.

1
komentarz 2 września 2020 przez sefir Dyskutant (8,560 p.)
Możesz poszukać coś o JavaFX MVC. Ja do tego widoki w SceneBuilderze robiłem, programowalnie robienie widoku to strasznie dużo kodu i czytelność się traci, że nie chciało mi się później na to patrzeć.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 530 wizyt
pytanie zadane 27 lipca 2022 w Java przez michal441599 Użytkownik (530 p.)
0 głosów
2 odpowiedzi 657 wizyt
pytanie zadane 13 marca 2023 w Java przez elvis Nowicjusz (210 p.)
0 głosów
1 odpowiedź 1,389 wizyt

93,732 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...