본문 바로가기

Java

javafx - dialog, ui스레드, mnemonic

public void handleNew() throws IOException {

  //실행창으로 실행시킴

 

 Runtime rt = Runtime.getRuntime();

  //rt.exec("calc");

메모장 실행 

rt.exec("notepad");

}

package main;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.net.URL;

import java.util.List;

import java.util.Optional;

import java.util.ResourceBundle;

 

import javafx.collections.ObservableList;

import javafx.fxml.FXML;

import javafx.fxml.FXMLLoader;

import javafx.fxml.Initializable;

import javafx.scene.Node;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.scene.control.Alert;

import javafx.scene.control.Alert.AlertType;

import javafx.scene.control.Button;

import javafx.scene.control.ButtonType;

import javafx.scene.control.ComboBox;

import javafx.scene.control.Label;

import javafx.scene.control.TextArea;

import javafx.scene.control.TextInputDialog;

import javafx.scene.image.ImageView;

import javafx.scene.layout.VBox;

import javafx.scene.paint.Color;

import javafx.stage.DirectoryChooser;

import javafx.stage.FileChooser;

import javafx.stage.FileChooser.ExtensionFilter;

import javafx.stage.Modality;

import javafx.stage.Popup;

import javafx.stage.Stage;

import javafx.stage.StageStyle;

 

public class RootController implements Initializable{

 

@FXML private ComboBox<String> comboBox;

@FXML private TextArea textArea;

 

private Stage primaryStage;

 

@Override

public void initialize(URL location, ResourceBundle resources) {

// 콤보 박스 항목 선택 변경 감지 이벤트 리스너 추가

comboBox.getSelectionModel().selectedIndexProperty()

.addListener((target,o,n)->{

// 새로 선택된 항목의 인덱스 번호

int index = n.intValue();

System.out.println("select comboBox : "+ index);

switch(index) {

case 0 :

// directory chooser

// javaFX에서 제공하는 폴더 선택 상자

DirectoryChooser chooser = new DirectoryChooser();

chooser.setTitle("디렉토리 선택");

// 오픈 기본 디렉토리 설정 : setInitialDirectory

// 현재 프로젝트에 src 폴더

//chooser.setInitialDirectory(new File("src"));

chooser.setInitialDirectory(new File("C:\\Temp"));

// showDialog - directory 선택 완료 시 또는 취소 시 까지 blocking

// dialog 창은 부모창에 부가적인 정보를 추가하는 창으로 창의 기능이 다하고 나면

// 소유권을 전달할 부모 창(stage)에 대한 정보가 전달되어야 함.

File selectedDir = chooser.showDialog(primaryStage); //돌아갈 무대정보 같이 제공

System.out.println(selectedDir);

if(selectedDir != null) {

System.out.println(selectedDir.isDirectory());

for(File f : selectedDir.listFiles()) {

textArea.appendText(f.getName()+"\n");

}

}

break;

case 1 :

//file chooser - file 선택 상자

FileChooser fileChooser = new FileChooser();

fileChooser.setInitialDirectory(new File("C:\\Temp"));

fileChooser.setTitle("로드할 문서를 선택해주세요!");

ObservableList<ExtensionFilter> filters = fileChooser.getExtensionFilters();

filters.addAll(

new ExtensionFilter("Text Files","*.txt","*.hwp","*.pdf"),

new ExtensionFilter("Image Filter","*.png","*.jpg","*.jpeg","*.gif"),

new ExtensionFilter("All Files","*.*")

);

// 파일선택창이 종료되기 전까지 blocking

// 종료가 되면 소유권을 전달할 스테이지 정보 전달

//File selectedFile = fileChooser.showOpenDialog(primaryStage);

// showSaveDialog: 앞으로 저장해야할 파일 경로를 생성해준다.

File selectedFile = fileChooser.showSaveDialog(primaryStage);

if(selectedFile != null) {

System.out.println(selectedFile.isFile());

System.out.println(selectedFile.getAbsolutePath());

 

}

 

// 여러 파일을 선택할 수 있는 dialog

List<File> selectedFiles = fileChooser.showOpenMultipleDialog(primaryStage);

System.out.println(selectedFiles);

break;

case 2 :

// popup window

handlePopUp();

break;

case 3 :

// custom window

handleCustom();

break;

}

 

});

 

}

 

// 사용자 정의형 dialog 생성

private void handleCustom() {

Stage stage = new Stage();

// DECORATED - 기본 값 = 일반적인 윈도우 스타일(제목줄 장식-아이콘,타이틀,축소,최대화면,닫기)

stage = new Stage(StageStyle.DECORATED);

// UNDECORATED - 흰 배경에 제목줄 x

stage = new Stage(StageStyle.UNDECORATED);

// UTILITY - 흰배경, 제목줄에 타이틀 종료 버튼만 존재

stage = new Stage(StageStyle.UTILITY);

// TRANSPARENT - 투명 배경 제목줄 x (initStyle : 생성자말고 메소드로도 스타일 변경 가능)

//stage.initStyle(StageStyle.TRANSPARENT);

stage.setTitle("Custom Dialog");

// 소유자 창 지정 - stage의 기능이 종료되면 돌아갈 소유자창 지정

//stage.initOwner(primaryStage);

// WINDOW_MODAL, APPLICATION_MODAL

// WINDOW_MODAL: 소유자 창이 지정되어 있을 경우 소유권을 이동하지 않음

// APPLICATION_MODAL : 전체 애플리케이션에서 소유자 창이 없어도 소유권을 이동하지 않음

//stage.initModality(Modality.WINDOW_MODAL);

stage.initModality(Modality.APPLICATION_MODAL);

Parent parent = null;

try {

parent = FXMLLoader.load(

getClass().getResource("/main/Custom.fxml")

);

} catch (IOException e) {}

 

ObservableList<Node> childrens = ((VBox)parent).getChildren();

for(Node n : childrens) {

Button btn = (Button)n;

String text = btn.getText();

System.out.println(text);

btn.setOnAction(e->{

handleAlertDialog(text);

});

}

 

 

Scene scene = new Scene(parent);

scene.setFill(Color.TRANSPARENT);

stage.setScene(scene);

stage.setResizable(false);

stage.show();

}

 

 

private void handleAlertDialog(String text) {

System.out.println(text);

switch(text) {

case "알림1" :

Alert alert = new Alert(AlertType.INFORMATION);

alert.setTitle(text);

alert.setHeaderText("알림창 입니다.\n헤더정보입니다."); //null값 넣으면 내용 안쓸 수 있음.

alert.setContentText("이곳은 컨텐츠 정보입니다.\n내용을 확인하세요.");

alert.show();

break;

case "경고2" :

alert = new Alert(AlertType.WARNING);

alert.setTitle(text);

alert.setHeaderText("경고창!");

alert.setContentText(null);

alert.show();

break;

case "오류3" :

alert = new Alert(AlertType.ERROR);

alert.setTitle(text);

alert.setHeaderText(null);

alert.setContentText("오류창!");

alert.show();

break;

case "확인4" :

alert = new Alert(AlertType.CONFIRMATION);

alert.setTitle("결제 확인");

alert.setHeaderText("구매하실 상품의 결제 정보입니다.");

alert.setContentText("확인 시 5,000,000원 결제 됩니다.");

//전달받는 버튼 타입 확인

Optional<ButtonType> result = alert.showAndWait();

if(result.get() == ButtonType.OK) {

System.out.println("결제 완료");

}else if(result.get() == ButtonType.CANCEL) {

// cancel 버튼 || 닫기 버튼 || alt f4

System.out.println("결제 취소");

}

break;

case "입력5" :

// 간단한 문자열을 입력받을 수 있는 창

TextInputDialog dialog = new TextInputDialog("이수석");

dialog.setTitle(text);

dialog.setHeaderText(null);

dialog.setContentText("이름을 입력해주세요.");

Optional<String> res = dialog.showAndWait();

// 확인 버튼 눌리면 true , 취소 : false

if(res.isPresent()) {

String name = res.get();

System.out.println("name : " + name);

}else {

System.out.println("취소");

}

break;

case "Custom6" :

alert = new Alert(

AlertType.NONE,

"이곳은 content 정보입니다.\n내용을 확인하세요",

ButtonType.OK,

ButtonType.CANCEL,

ButtonType.NEXT,

ButtonType.PREVIOUS

);

alert.setTitle(text);

alert.setHeaderText(null);

Optional<ButtonType> result1 = alert.showAndWait();

if(result1.get() == ButtonType.OK) {

System.out.println("확인");

}else if(result1.get() == ButtonType.NEXT) {

System.out.println("다음");

}

//...

break;

}

}

 

private void handlePopUp() {

Popup popup = new Popup();

 

Parent parent = null;

try {

parent = FXMLLoader.load(

getClass().getResource("Popup.fxml")

);

} catch (IOException e) {

e.printStackTrace();

}

popup.setAutoHide(false); // true : 포커스 이동시 자동종료

 

ImageView imageView = (ImageView)parent.lookup("#imgMessage");

imageView.setOnMouseClicked(event->{

System.out.println("image mouse click!");

popup.hide();

});

 

Label lblMessage = (Label)parent.lookup(".lblMessage");

lblMessage.setText("메세지 알림");

 

popup.getContent().add(parent);

popup.show(primaryStage); //어디서 popup창이 오픈되었는지 전달해줌

}

 

 

 

 

public void setStage(Stage primaryStage) {

this.primaryStage = primaryStage;

}

 

public void handleNew() throws IOException {

System.out.println("New!");

//실행창으로 실행

Runtime rt = Runtime.getRuntime();

//rt.exec("calc");

rt.exec("notepad");

}

 

// fileChooser를 이용하여 선택된 txt 파일의 정보를 읽어

// textArea에 출력

public void handleOpen() throws IOException {

System.out.println("Open!");

textArea.appendText("Open\n");

//파일 선택창

FileChooser fileChooser = new FileChooser();

fileChooser.getExtensionFilters().add(new ExtensionFilter("Text file","*.txt"));

fileChooser.setInitialDirectory(new File("c:\\temp"));

File selectedFile = fileChooser.showOpenDialog(primaryStage);

if(selectedFile != null) {

textArea.appendText(selectedFile.getPath()+"\n");

FileReader reader = new FileReader(selectedFile);

BufferedReader bReader = new BufferedReader(reader);

// 파일 추저로 선택된 txt파일의 텍스트 내용을

// textArea에 추가로 작성

String message = null;

while((message = bReader.readLine())!=null) {

textArea.appendText(message+"\n");

}

bReader.close();

}

}

 

public void handleSave() throws IOException {

System.out.println("Save!");

FileChooser fileChooser = new FileChooser();

fileChooser.getExtensionFilters().add(new ExtensionFilter("text files","*.txt"));

File selectedFile = fileChooser.showSaveDialog(primaryStage);

if(selectedFile != null) {

System.out.println(selectedFile.getPath());

FileWriter writer = new FileWriter(selectedFile,true);

BufferedWriter bWriter = new BufferedWriter(writer);

String message = textArea.getText();

bWriter.write(message);

bWriter.flush();

bWriter.close();

 

}

}

 

public void handleClose() {

System.out.println("Close!");

}

 

}

 

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

 

<?import javafx.scene.control.Button?>

<?import javafx.scene.control.ComboBox?>

<?import javafx.scene.control.Menu?>

<?import javafx.scene.control.MenuBar?>

<?import javafx.scene.control.MenuItem?>

<?import javafx.scene.control.SeparatorMenuItem?>

<?import javafx.scene.control.TextArea?>

<?import javafx.scene.control.ToolBar?>

<?import javafx.scene.image.Image?>

<?import javafx.scene.image.ImageView?>

<?import javafx.scene.input.KeyCodeCombination?>

<?import javafx.scene.layout.BorderPane?>

<?import javafx.scene.layout.VBox?>

<?import javafx.collections.*?>

<?import java.lang.*?>

 

<BorderPane prefHeight="200.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="study.RootController">

<top>

<VBox BorderPane.alignment="CENTER">

<children>

<MenuBar>

<menus>

<!-- Mnemonic Parsing : true 일때 (_다음 글자)가 alt+단축키 로 지정됨 -->

<Menu text="_File">

<items>

<MenuItem onAction="#handleNew" text="새로만들기">

<!--

KeyCodeCombination : 단축키 추가

DOWN 되어있는 거랑 code key 가 같이 눌려져야함

-->

<accelerator>

<!--

meta : windows - window function, mac : meta

shortcut : windows, linux : ctrl, mac : meta

-->

<KeyCodeCombination alt="DOWN" code="N" control="UP" meta="UP" shift="DOWN" shortcut="UP" />

</accelerator>

 

<!-- 이미지 추가는 graphic으로 -->

<graphic>

<ImageView>

<image>

<Image url="@../icons/new.png" />

</image>

</ImageView>

</graphic>

</MenuItem>

<MenuItem onAction="#handleOpen" text="열기">

<graphic>

<ImageView>

<image>

<Image url="@../icons/open.png" />

</image>

</ImageView>

</graphic>

<accelerator>

<KeyCodeCombination alt="UP" code="O" control="DOWN" meta="UP" shift="UP" shortcut="UP" />

</accelerator>

</MenuItem>

<MenuItem onAction="#handleSave" text="저장">

<graphic>

<ImageView>

<image>

<Image url="@../icons/save.png" />

</image>

</ImageView>

</graphic>

<accelerator>

<KeyCodeCombination alt="UP" code="S" control="DOWN" meta="UP" shift="UP" shortcut="UP" />

</accelerator>

</MenuItem>

<SeparatorMenuItem mnemonicParsing="false" />

<MenuItem onAction="#handleClose" text="닫기" />

 

<Menu text="추가 메뉴">

<items>

<MenuItem text="고등어" />

<MenuItem text="갈치" />

<MenuItem text="조기" />

</items>

</Menu>

 

</items>

</Menu>

<Menu mnemonicParsing="false" text="편집">

<items>

<MenuItem mnemonicParsing="false" text="Delete" />

</items>

</Menu>

<Menu mnemonicParsing="false" text="이동">

<items>

<MenuItem mnemonicParsing="false" text="About" />

</items>

</Menu>

</menus>

</MenuBar>

<ToolBar prefHeight="40.0" prefWidth="200.0">

<items>

<Button onAction="#handleNew">

<graphic>

<ImageView>

<image>

<Image url="@../icons/new.png"/>

</image>

</ImageView>

</graphic>

</Button>

<Button onAction="#handleOpen">

<graphic>

<ImageView>

<image>

<Image url="@../icons/open.png"/>

</image>

</ImageView>

</graphic>

</Button>

<Button onAction="#handleSave">

<graphic>

<ImageView>

<image>

<Image url="@../icons/save.png"/>

</image>

</ImageView>

</graphic>

</Button>

<ComboBox fx:id="comboBox" prefWidth="150.0" promptText="선택">

<items>

<!-- factory이용해서 정적메소드 호출 -->

<FXCollections fx:factory="observableArrayList">

<String fx:value="directory chooser" />

<String fx:value="file chooser" />

<String fx:value="popup" />

<String fx:value="Custom Window" />

</FXCollections>

</items>

</ComboBox>

</items>

</ToolBar>

</children>

</VBox>

</top>

<center>

<TextArea fx:id="textArea" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />

</center>

</BorderPane>

 


package application;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCharacterCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.Mnemonic;
import javafx.stage.Stage;

public class RootController implements Initializable{

@FXML private Button btn1, btn2, btn3;

@Override
public void initialize(URL location, ResourceBundle resources) {
//btn1.setMnemonicParsing(true);
btn1.setText("_A 버튼");
btn1.setOnAction(e->{
System.out.println("1번 버튼 선택");
});

btn2.setText("_S 버튼");
btn2.setOnAction(e->{
System.out.println("2번 버튼 선택");
});

btn3.setText("ss_Oreo");
btn3.setOnAction(e->{
System.out.println("3번 버튼 선택");
});
}

public void setPrimaryStage(Stage primaryStage) {
// alt keyCode 조합이 아닌 단축키 조합 추가
KeyCombination kc = new KeyCharacterCombination("P",
KeyCombination.ALT_DOWN,
KeyCombination.SHIFT_DOWN
);
Mnemonic mnemonic = new Mnemonic(btn1,kc);
primaryStage.getScene().addMnemonic(mnemonic); // 등록시켜줄때 무대정보 필요함.
}

}

'Java' 카테고리의 다른 글

메소드 참조  (0) 2023.09.15
Stream  (0) 2023.09.14
javafx - list View , tableView, media, chart  (0) 2023.06.07
타임존 개념이 없는 시간을 나타내는 Local클래스  (0) 2023.06.06
프로젝트  (0) 2023.06.05