본문 바로가기
자바

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

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

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

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

기존 창을 닫을 때,

 

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

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

 

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

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

 

 

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

 

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

 

 

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

설명은 주석과 코드 아랫부분에 있습니다.
먼저 처음 시작하는 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
반응형

댓글