์ ๋ฉ์ถ ํ๋ก๊ทธ๋จ
1.
๋ฐ์ดํฐ ์์ง
a.
๋ฉ๋ด ๋ฆฌ์คํธ 20๊ฐ
b.
๋ฉ๋ด ์ด๋ฏธ์ง 20๊ฐ
2.
ํ๋ฉด
a.
ํ๋ก๊ทธ๋จ ์ ๋ชฉ ๋ผ๋ฒจ
b.
์ด๋ฏธ์ง ์์ญ
c.
๋ฉ๋ด ์ด๋ฆ ๋ผ๋ฒจ
d.
์ถ์ฒ ๋ฒํผ
3.
๊ธฐ๋ฅ
a.
Menu ๊ฐ์ฒด ์ ์
i.
name : ๋ฉ๋ด์ด๋ฆ
ii.
img : ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก
b.
๋๋ค ์ถ์ฒ ๊ธฐ๋ฅ
i.
์ถ์ฒ ๋ฒํผ ํด๋ฆญ ๋ฉ์๋ ์ฐ๊ฒฐ
ii.
20๊ฐ์ ๋ฉ๋ด ์์๋ค ์ค, ๋๋ค์ผ๋ก ํ๋ ์ ํ
iii.
์ ํ๋ ์ซ์์ ๋ฉ๋ด ์ด๋ฆ์ ๋ผ๋ฒจ์ ๋ณ๊ฒฝ
iv.
์ ํ๋ ์ซ์์ ๋ฉ๋ด ์ด๋ฏธ์ง๋ฅผ ์ด๋ฏธ์ง ์์ญ์ ์ง์
์คํํ๋ฉด
ํ๋ก์ ํธ ํธ๋ฆฌ๊ตฌ์กฐ
๐ฆ ์ ๋ฉ์ถ
โโโ ๐ src
โ โโโ ๐ application
โ โ โโโ ๐ย Main.java
โ โ โโโ ๐ย Main.fxml
โ โ โโโ ๐ย MainController.java
โ โ โโโ ๐ย Menu.java
โ โ โโโ ๐ย application.css
โ โ โโโ ๐ img
โ โ โโโ ๐ผ ๋ฉ๋ด.jpg
โ โโโ ๐ module-info.java
โโโ ๐ lib
โโโ ๐ lombok.jar
Plain Text
๋ณต์ฌ
์์ ์์
1.
๋ฉ๋ด ์ด๋ฏธ์ง ์ค๋นํ๊ธฐ
a.
์ด๋ฏธ์ง 20๊ฐ ๋ค์ด๋ก๋
b.
src ํด๋ ๋ฐ์ img ํด๋ ๋ง๋ค๊ธฐ
c.
img ํด๋์ ์ด๋ฏธ์ง ๋ฃ๊ธฐ
2.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๋นํ๊ธฐ
a.
ํ๋ก์ ํธ ๋ฐ์ lib ํด๋ ๋ง๋ค๊ธฐ
b.
lombok.jar ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฃ๊ธฐ
c.
Build Path ์ ์ถ๊ฐํ๊ธฐ
i.
ํ๋ก์ ํธ ์ฐํด๋ฆญ
ii.
Build Path
iii.
Configure Build Path
1.
Module Path ํด๋ฆญ
2.
Add Jarโฆ
3.
lombok.jar ์ ํ
3.
๋ชจ๋ ์ค์
a.
module-info.java
b.
fxml ๋ชจ๋ ๊ตฌ์ฑ
requires javafx.fxml;
Java
๋ณต์ฌ
c.
lombok ๋ชจ๋ ๊ตฌ์ฑ
requires lombok;
Java
๋ณต์ฌ
4.
ํ๋ฉด ๊ทธ๋ฆฌ๊ธฐ
a.
Main.fxml ํ์ผ ์์ฑ
b.
Scene Builder ๋ก ํ๋ฉด ๊ทธ๋ฆฌ๊ธฐ
i.
AnchorPane ๋ฃจํธ ์ปจํ
์ด๋ ์ง์
ii.
Label โ์ ๋ฉ์ถโ
iii.
Pane ์ปจํ
์ด๋
1.
ImageView
a.
๊ธฐ๋ณธ ์ด๋ฏธ์ง icon.png
b.
fx:id=โimgโ
iv.
Label โ๋ฉ๋ด ์ด๋ฆโ
1.
fx:id=โmenuโ
v.
Button โ์ถ์ฒโ
1.
onAction=โrandomโ
5.
Menu ํด๋์ค ์ ์
a.
b.
Lombok ์ ์ฉ
i.
@Data : @Getter, @Setter, @ToString, @RequiredArgsConstructor, โฆ
ii.
@NoArgsConstructor : ๊ธฐ๋ณธ ์์ฑ์
iii.
@AllArgsConstructor : ์ ์ฒด ๋งค๊ฐ๋ณ์ ์์ฑ์
6.
Main ํด๋์ค ์ ์
a.
Main.fxml ๋ก ํ๋ฉด์ด ์ด๊ธฐํ๋ฉด์ด ์ด๋ฆฌ๋๋ก ์ฝ๋ ์์ฑ
7.
MainController.java ์ปจํธ๋กค๋ฌ ์ ์
a.
SceneBuilder ์์ Controller ๋ก ์ง์ : application.MainController
b.
์ปจํธ๋กค๋ฌ ์๋ ์์ฑ
i.
View
1.
Show Sample Controller Skeleton
2.
Save as
3.
์ ์ฅ
c.
์ฝ๋ ์์ฑ
์ฝ๋
module-info.java
module ์ ๋ฉ์ถ {
requires javafx.controls;
requires javafx.fxml;
requires lombok;
opens application to javafx.graphics, javafx.fxml;
}
Java
๋ณต์ฌ
ย Main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/25" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController">
<children>
<Label alignment="CENTER" layoutX="210.0" layoutY="39.0" prefHeight="45.0" prefWidth="181.0" text="์ ๋ฉ์ถ">
<font>
<Font size="40.0" />
</font>
</Label>
<Pane layoutX="150.0" layoutY="123.0" prefHeight="300.0" prefWidth="300.0">
<children>
<ImageView fx:id="img" fitHeight="250.0" fitWidth="250.0" layoutX="25.0" layoutY="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../img/icon.png" />
</image>
</ImageView>
</children>
</Pane>
<Label fx:id="menu" alignment="CENTER" layoutX="210.0" layoutY="437.0" prefHeight="45.0" prefWidth="181.0" text="๋ฉ๋ด">
<font>
<Font size="30.0" />
</font>
</Label>
<Button fx:id="button" layoutX="176.0" layoutY="512.0" mnemonicParsing="false" onAction="#random" prefHeight="50.0" prefWidth="250.0" text="์ถ์ฒ">
<font>
<Font size="30.0" />
</font>
</Button>
</children>
</AnchorPane>
XML
๋ณต์ฌ
ย Main.java
package application;
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 {
private static Scene scene;
public static Stage stage;
/**
* ํ๋ฉด ์์ ๋ฉ์๋
* @throws Exception
*/
@Override
public void start(Stage primaryStage) throws Exception {
stage = primaryStage;
// Main.fxml ํ๋ฉด ํ์ผ์ ๋ก๋
Parent container = loadFXML("Main");
// Main.fxml ํ๋ฉด ๋ ์ด์์์ ์ง์ ํ์ฌ Scene ์์ฑ
scene = new Scene(container);
// Stage ์ Scene ๋ฑ๋ก
stage.setScene(scene);
// Stage ์ถ๋ ฅ
stage.show();
}
/**
* Scene ์ FXML ๋ก ๋ถ๋ฌ์จ ์ปจํ
์ด๋๋ฅผ ์ง์ ํ๋ ๋ฉ์๋
* @param fxml
* @throws Exception
*/
public static void setRoot(String fxml) throws Exception {
scene.setRoot( loadFXML(fxml) );
Main.stage.sizeToScene(); // FXML ์ ์ง์ ํ ํฌ๊ธฐ๋ก ์๋์ฐ ํฌ๊ธฐ ๋ณ๊ฒฝ
}
/**
* FXML ํ์ผ์ ๋ถ๋ฌ์ค๋ ๋ฉ์๋
* @param fxml
* @return
* @throws Exception
*/
public static Parent loadFXML(String fxml) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
public static void main(String[] args) {
launch(args);
}
}
Java
๋ณต์ฌ
ย Menu.java
package application;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu {
String menu; // ๋ฉ๋ด ์ด๋ฆ
String img; // ์ด๋ฏธ์ง ๊ฒฝ๋ก
}
Java
๋ณต์ฌ
ย MainController.java
package application;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;
public class MainController {
@FXML private Button button;
@FXML private ImageView img;
@FXML private Label menu;
// ๋ฉ๋ด ๋ฆฌ์คํธ
private static List<Menu> MENU_LIST;
// ํ์ด๋จธ1 - 0.05 ์ด๋ง๋ค ๋ฉ๋ด๋ณ๊ฒฝ ํ์ด๋จธ
private Timeline rotate = null;
// ํ์ด๋จธ2 - 3์ด ๋ค ๋๋ค๋ฉ๋ด๋ฅผ ๊ณ ๋ฅด๋ ํ์ด๋จธ
private Timeline stop = null;
/**
* FXML ์ด ๋ก๋ฉ๋ ๋ ์ด๊ธฐํํ๋ ๋ฉ์๋
* * ๋ฐ์ดํฐ ์ด๊ธฐํ
* * ์ด๋ฒคํธ ๋ฑ๋ก
*/
@FXML
public void initialize() {
// ๋ฐ์ดํฐ ์ด๊ธฐํ
initData();
// ํ์ด๋จธ ์ธํ
initTimer();
}
/**
* ๋ฐ์ดํฐ ์ด๊ธฐํ
*/
void initData() {
MENU_LIST = new ArrayList<Menu>();
List<String> nameList
= Arrays.asList("๊ตญ๋ฐฅ","๊ท์นด์ธ ","๊น๋ฐฅ","๋๊น์ค","๋ก๋ณถ์ด",
"๋ง๋ผํ","๋ถ๋์ฐ๊ฐ","์ผ๊ฒน์ด","์ผ์ข๋น","์คํ
์ดํฌ",
"์ฐ๋","์กํ","์ด๋ฐฅ","์นํจ","์นด๋ ",
"ํ
๋","ํ์คํ","ํผ์","ํจ๋ฐ์คํ
์ดํฌ","ํ๋ฒ๊ฑฐ");
List<String> imgList
= Arrays.asList("๊ตญ๋ฐฅ.jpg","๊ท์นด์ธ .jpg","๊น๋ฐฅ.jpg","๋๊น์ค.jpg","๋ก๋ณถ์ด.jpg",
"๋ง๋ผํ.jpg","๋ถ๋์ฐ๊ฐ.jpg","์ผ๊ฒน์ด.jpg","์ผ์ข๋น.jpg","์คํ
์ดํฌ.jpg",
"์ฐ๋.jpg","์กํ.jpg","์ด๋ฐฅ.jpg","์นํจ.jpg","์นด๋ .jpg",
"ํ
๋.jpg","ํ์คํ.jpg","ํผ์.jpg","ํจ๋ฐ์คํ
์ดํฌ.jpg","ํ๋ฒ๊ฑฐ.jpg");
for (int i = 0; i < 20; i++) {
String name = nameList.get(i);
String img = imgList.get(i);
MENU_LIST.add( new Menu(name, img) );
}
}
/**
* ํ์ด๋จธ ์ธํ
*/
public void initTimer() {
// 0.05์ด ๋ง๋ค ๋๋ค ํ์ด๋จธ
rotate = new Timeline(
new KeyFrame(Duration.millis(50), e -> {
// ๋๋ค ๋ฉ๋ด ์ธํ
setMenu();
})
);
rotate.setCycleCount( Timeline.INDEFINITE );
// 3์ด ๋ค์ ๋ฉ๋ด ๊ณ ๋ฅด๋ ํ์ด๋จธ
stop = new Timeline(
new KeyFrame( Duration.millis(3000), e -> rotate.stop() )
);
stop.setCycleCount(1);
}
/**
* ๋๋ค ๋ฉ๋ด ๋ฝ๊ธฐ
*/
public void setMenu() {
// 20๊ฐ์ ๋ฉ๋ด ์์๋ค ์ค, ๋๋ค์ผ๋ก ํ๋ ์ ํ
Random random = new Random();
int index = random.nextInt(20);
Menu randomMenu = MENU_LIST.get(index);
String menuName = randomMenu.getMenu();
String menuImg = randomMenu.getImg();
// ๋ฉ๋ด๋ช
๋ผ๋ฒจ์ ์ง์
menu.setText( menuName );
// ๋ฉ๋ด ์ด๋ฏธ์ง ์ง์
String filePath = getClass().getResource("/img/" + menuImg).toExternalForm();
img.setImage( new Image(filePath) );
}
@FXML
void random(ActionEvent event) {
// ์ด์ ํ์ด๋จธ ์ค์ง
rotate.stop();
stop.stop();
// ํ์ด๋จธ ์์
rotate.play();
stop.play();
}
}
Java
๋ณต์ฌ




