자바

자바 자바fx 로그인화면 , 패스워드화면 , 초기처리화면 , 새창띄우기 , 화면자동닫기 [김철수홍길동]

세상 모든 것 들은 그 자신을 위해 존재한다. 2021. 1. 29. 14:30

프로그램을 처음 실행할 때,

새로운 창을 열때 ,패스워드를 입력받을때,

기존 창을 닫을 때,

 

특히 서버,클라이언트 프로그램에서 

클라이언트 프로그램 처음실행시 에는 필요한 데이터를 받아올때딜레이가 발생합니다.그때 사용자는 답답합을 느낄수가 있는데요.쓰레드를 사용해서 , 또 프로그레스바등을 사용해서현재 진행 상태를 보여줏시면 사용자는 답답함을 덜 느끼게 될겁니다.또 사용장의 클릭을 유도해 시간단축의 착시효과를 볼수 있습니다.

 

처음 접속 시 데이터를 다운로드할 동안 기다려야 할 때

사용할 수 있는 예제입니다.

 

 

그중에 하나의 기능만 필요하신분은 아래의 링크를 클릭하세요.

 

패스워드를 입력받고 기존창을 닫으면서 새로운창을 열때

 

 

사용 예제 ) 코드를 복붙 하여 실행해 보시기 바랍니다.

설명은 주석과 코드 아랫부분에 있습니다.
먼저 처음 시작하는 Main.java 파일입니다.

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {


	@Override
	public void start(Stage primaryStage) {
		try {
			//시작할때 로그인 준비창을 먼저 띄움니다.
			Parent root = FXMLLoader.load(getClass().getResource("Login.fxml"));
			Scene scene = new Scene(root);
			primaryStage.setScene(scene);
			primaryStage.setAlwaysOnTop(true);
			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		launch(args);
	}

}

 

두 번째는 Login.fxml 파일입니다.

그대로 복붙 하셔서 사용하시면 되겠습니다.

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.Cursor?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.effect.SepiaTone?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="244.0" prefWidth="350.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController">
   <children>
      <Button fx:id="myButton" layoutX="225.0" layoutY="106.0" mnemonicParsing="false" onAction="#Login" text="Start">
         <font>
            <Font size="18.0" />
         </font>
      </Button>
      <ProgressIndicator fx:id="p" layoutX="14.0" layoutY="14.0" prefHeight="33.0" prefWidth="40.0">
         <cursor>
            <Cursor fx:constant="DISAPPEAR" />
         </cursor>
         <effect>
            <SepiaTone />
         </effect>
      </ProgressIndicator>
      <ProgressBar fx:id="p1" layoutX="30.0" layoutY="205.0" prefHeight="18.0" prefWidth="290.0">
         <cursor>
            <Cursor fx:constant="DISAPPEAR" />
         </cursor>
         <effect>
            <SepiaTone />
         </effect>
      </ProgressBar>
      <Label fx:id="l" layoutX="61.0" layoutY="154.0" prefHeight="69.0" prefWidth="229.0" text="서버에서 필요한 데이터를 받고 있습니다." />
      <PasswordField fx:id="pw1" layoutX="34.0" layoutY="106.0" prefHeight="33.0" prefWidth="154.0" />
   </children>
</AnchorPane>

세 번째로는 login.fxml 파일의 핸들러 파일입니다.

그대로 복붙 하여 사용해보시고 , 
설명은 주석으로 하였습니다.

 

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class MainController {

	@FXML
	private Label l;
	
	//패스워드 필드 
    @FXML
    private PasswordField pw1;
    
	@FXML
	private Button myButton;
	@FXML
	private ProgressBar p1;
	@FXML
	private ProgressIndicator p;

	public void Login(ActionEvent event) throws Exception {

		//패스워드를 체크하는 함수 정의는 아랫부분에 습니다
		checkPassword();
		
		// --------------------------------thrread------------------------------
		//progressbar표시를 위한 스레드를 시작합니다.
		//이예제에다 서버접속시 다운받을 데이터를 추가로 받는 부분을 넣어도 됩니다.
		Thread thread2 = new Thread() {
			@Override
			public void run() {
				//progressbar는 double형을 사용합니다.
				double i = 0.01;
				while (true) {
					i = i + 0.01;
					
					//00부터 1사이의 값을 전달하기 위해서 1이 넘으면 끝냅니다.
					if (i > 1) {
						break;
					}
					//프로그레스바를 표시하는 함ㅅ수 입니다.
					//함수는 밑부분에 정의 되어 있습니다.
					printP(i);
					//System.out.println("i : " + i);
				}
				
				//프로그레스바가 끝가지 가면 현재 화면을 종료하는 함수
				//현재창을 계속유지한상태에서 새로운창을 열려면 
				//줏석처리 하세요.
				closeStage();
			};
		};
		
		//메인프로그램과 같이 종료 한다는 의미 입니다.
		thread2.setDaemon(true);
		thread2.start();
		
		//새로운 창인 Main.fxml을 시작합니다.
		
		Stage primaryStage = new Stage();
		Parent root;
		try {
			root = FXMLLoader.load(getClass().getResource("Main.fxml"));
			Scene scene = new Scene(root);
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}

	// ---------------------------progressbar푯시함수
	public void printP(double i) {
		Platform.runLater(() -> {
			p1.setProgress(i);
			l.setVisible(false);
		});
		try {
			Thread.sleep(10);
			l.setVisible(true);
		} catch (InterruptedException e) {
		}
	}
	
	// ---------------------------기존창 닫는함수
	public void closeStage() {
		Stage stage11 = (Stage) myButton.getScene().getWindow();
		Platform.runLater(() -> {
			stage11.close();
		});
	}
	
	// ---------------------------패스워드 확인함수
	//패스워드가 맞으면 프로그램을 계속진행하고 틀리면 바로종료하는 함수입니다.
	public void checkPassword() {
		String Password = "1234"; 
		if(pw1.getText().equals(Password)) {
			System.out.println("패스워드 맞음");
		}else {
			System.out.println("패스워드틀림 ");
			
			//현재프로그램을 끝낸다는 부분입니다.
			Platform.exit();
			
		}
					
		Platform.runLater(() -> {
			
		});
	}
	

}

복잡해 보이나 자세히 보면 정말 간단한 예제입니다.

 

마지막으로 새로운 창의 main.fxml파일입니다.

예제를 실행하기 위해 빈 화면을 사용했습니다.

사실상 기능은 없으며 

실전에서는 필요한 창을 연결하시면 됩니다.

그리고 핸들러 또한 지정해주시면 되겠습니다.

여기 예제에서는 핸들러는 필요치 않아 넣지 않았습니다.

 

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="510.0" prefWidth="616.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController">
   <children>
      <Label layoutX="339.0" layoutY="449.0" text="Main Windows">
         <font>
            <Font size="18.0" />
         </font>
      </Label>
   </children>
</AnchorPane>

 

 

실행 영상입니다.

728x90
반응형