프로그램을 처음 실행할 때,
새로운 창을 열때 ,패스워드를 입력받을때,
기존 창을 닫을 때,
특히 서버,클라이언트 프로그램에서
클라이언트 프로그램 처음실행시 에는 필요한 데이터를 받아올때딜레이가 발생합니다.그때 사용자는 답답합을 느낄수가 있는데요.쓰레드를 사용해서 , 또 프로그레스바등을 사용해서현재 진행 상태를 보여줏시면 사용자는 답답함을 덜 느끼게 될겁니다.또 사용장의 클릭을 유도해 시간단축의 착시효과를 볼수 있습니다.
처음 접속 시 데이터를 다운로드할 동안 기다려야 할 때
사용할 수 있는 예제입니다.
그중에 하나의 기능만 필요하신분은 아래의 링크를 클릭하세요.
사용 예제 ) 코드를 복붙 하여 실행해 보시기 바랍니다.
설명은 주석과 코드 아랫부분에 있습니다.
먼저 처음 시작하는 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
반응형
'자바' 카테고리의 다른 글
자바 자바fx 쓰레드를 이용한 시계 만들기 예제 [김철수홍길동] (0) | 2021.02.03 |
---|---|
자바fx 패스워드를 입력받고 기존창을 닫으면서 새로운 창을열때 [김철수홍길동] (0) | 2021.01.30 |
자바 특정일의 주차,일자 구하기 [김철수홍길동] (0) | 2021.01.23 |
자바 현재의 주차,일자 구하기 [김철수홍길동] (0) | 2021.01.23 |
자바 자바fx 파일저장 FileChooser , 디렉토리선택 DirectoryChooser , [북붙따라하기] (0) | 2021.01.11 |
댓글