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 |