<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>j_huuuuns.log</title>
        <link>https://velog.io/</link>
        <description>한줄</description>
        <lastBuildDate>Mon, 23 Jan 2023 10:56:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>j_huuuuns.log</title>
            <url>https://velog.velcdn.com/images/j_huuuuns/profile/88a68bd0-e0c9-439e-b5b4-063452b784e4/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. j_huuuuns.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/j_huuuuns" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[JavaFX 가이드] 4. 컨테이너]]></title>
            <link>https://velog.io/@j_huuuuns/JavaFX-%EA%B0%80%EC%9D%B4%EB%93%9C-4.-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88</link>
            <guid>https://velog.io/@j_huuuuns/JavaFX-%EA%B0%80%EC%9D%B4%EB%93%9C-4.-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88</guid>
            <pubDate>Mon, 23 Jan 2023 10:56:55 GMT</pubDate>
            <description><![CDATA[<h1 id="1-컨테이너">1. 컨테이너</h1>
<blockquote>
<p>컨트롤을 쉽게 배치할 수 있도록 도와주는 클래스</p>
</blockquote>
<p>▼컨트롤이란?
사용자와 상호작용 하기 위한 이벤트를 생성하는 개체 </p>
<h1 id="11-컨테이너의-종류">1.1 컨테이너의 종류</h1>
<h1 id="111-anchorpane">1.1.1 AnchorPane</h1>
<blockquote>
<p>컨트롤을 좌표로 배치하는 컨테이너</p>
</blockquote>
<ul>
<li>AnchorPane 컨테이너는 Scenebuilder를 사용하여 쉽게 디자인 할 수 있다.</li>
<li>AnchorPane을 사용해서 컨트롤을 좌표로 배치하면 컨트롤의 재배치가 일어나지 않는다.</li>
<li>Stage의 setResizable(false) 메소드를 호출하여 이용할 수 있다.</li>
</ul>
<h1 id="112-borderpane-컨테이너">1.1.2 BorderPane 컨테이너</h1>
<blockquote>
<p>top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너</p>
</blockquote>
<ul>
<li>다른 컨테이너도 배치 가능하지만 각 셀에 하나의 개체만 배치 가능 </li>
<li>top,bottom등을 배치하지 않으면 center에 배치된 개체가 자동으로 확장된다.</li>
</ul>
<h1 id="113-flowpane">1.1.3 FlowPane</h1>
<blockquote>
<p>행으로 컨트롤을 배치하되 공간이 부족하면 새로운 행에 배치하는 컨테이너</p>
</blockquote>
<h1 id="114-tilepane">1.1.4 TilePane</h1>
<blockquote>
<p>그리드로 컨트롤을 배치하되,고정된 크기를 갖는 컨테이너 </p>
</blockquote>
<ul>
<li>FlowPane과 유사</li>
</ul>
<h1 id="115-gridpane">1.1.5 GridPane</h1>
<blockquote>
<p>그리드로 컨트롤을 배치하되 셀의 크기가 유동적인 컨테이너</p>
</blockquote>
<ul>
<li>셀 병합이 가능하기 때문에 입력 폼 제작시 유용 </li>
</ul>
<h1 id="116-stackpane">1.1.6 StackPane</h1>
<blockquote>
<p>컨트롤을 겹쳐 배치하는 컨테이너 </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaFX 가이드] 3. 레이아웃]]></title>
            <link>https://velog.io/@j_huuuuns/JavaFX-3.-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</link>
            <guid>https://velog.io/@j_huuuuns/JavaFX-3.-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</guid>
            <pubDate>Tue, 17 Jan 2023 13:09:06 GMT</pubDate>
            <description><![CDATA[<h1 id="1-레이아웃">1. 레이아웃</h1>
<blockquote>
<p><em><strong>Scene에는 다양한 컨트롤이 포함되는데, 이들을 배치하는 것을 Layout(레이아웃) 이라 한다.</strong></em></p>
</blockquote>
<p>JavaFX에서 레이아웃을 작성하는 방법은 2가지가 있다.</p>
<ul>
<li>프로그램적 레이아웃</li>
<li>선언적 레이아웃 </li>
</ul>
<h1 id="11-프로그램적-레이아웃">1.1 프로그램적 레이아웃</h1>
<blockquote>
<p>자바 코드로 UI 컨트롤을 배치 </p>
</blockquote>
<ul>
<li>컨트롤 배치, 스타일 지정, 이벤트 처리를 모두 자바 코드로 작성</li>
<li>레이아웃이 복잡할수록 난해해지기 쉬움 </li>
<li>개발자가 직접 작성해야 하므로 디자이너와 협업 어려움</li>
<li>간단한 레이아웃 변경에도 재컴파일해야하는 단점 존재</li>
</ul>
<h1 id="12-fxml-선언-레이아웃">1.2 FXML 선언 레이아웃</h1>
<blockquote>
<p>XML기반 마크업 언어인 FXML로 UI 레이아웃을 태그로 선언</p>
</blockquote>
<ul>
<li>Android App 개발과 유사 </li>
<li>디자이너와 협업 쉽고, 간단한 레이아웃 편집은 태그만 수정 </li>
<li>Scene 간 재사용이 쉬워 개발 기간 단축 가능</li>
</ul>
<p>다음은 동일한 레이아웃을 가진 코드를 각각 프로그램적 레이아웃과 FXML 방법으로 작성한 코드이다 </p>
<h4 id="프로그램적-레이아웃">프로그램적 레이아웃</h4>
<pre><code class="language-java">//root.java
package application.myapp;

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class root extends Application {

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        HBox hbox = new HBox(); //HBOX 컨테이너 생성
        TextField textField = new TextField(); // TextField 컨트롤 생성
        textField.setPrefWidth(100); // TextField 폭 설정

        ObservableList list = hbox.getChildren(); // HBOX의 ObservableList 얻기
        list.add(textField); // TextField 컨트롤 배치

        Scene scene = new Scene(hbox); // Scene 생성
        primaryStage.setScene(scene); // stage에 Scene 할당
        primaryStage.show();
    }
}</code></pre>
<h4 id="fxml-선언-레이아웃">FXML 선언 레이아웃</h4>
<pre><code class="language-java">//root.fxml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;?import java.lang.*?&gt;
&lt;?import java.util.*?&gt;
&lt;?import javafx.scene.*?&gt;
&lt;?import javafx.scene.control.*?&gt;
&lt;?import javafx.scene.layout.*?&gt;

&lt;HBox xmlns:fx=&quot;http://javafx.com/fxml&quot;&gt;
    &lt;children&gt;
        &lt;TextField&gt;
            &lt;prefWidth&gt;200&lt;/prefWidth&gt;
        &lt;/TextField&gt;
    &lt;/children&gt;
&lt;/HBox&gt;</code></pre>
<p><a href="https://gluonhq.com/products/scene-builder/">Scene Builder</a>를 사용하면 보다 쉽게 FXML을 작성할 수 있다.</p>
<h1 id="2-fxml-로딩">2. FXML 로딩</h1>
<blockquote>
<p><em><strong>FXML파일을 작성했다면, FXML파일을 읽어 선언된 내용을 객체화해야 한다.</strong></em></p>
</blockquote>
<p>FXML파일을 로딩하기 위해선 <em>javafx.fxml.FXMLLoader</em> 를 사용해야 한다. 
Loader는 정적 메소드 load() 와 인스턴스 메소드 load()를 가지고 있다.</p>
<h4 id="정적-메소드로-로딩">정적 메소드로 로딩</h4>
<pre><code class="language-java">Parent root = FXMLLoader.load(getClass().getResources(&quot;xxx.fxml&quot;));</code></pre>
<h4 id="인스턴스-메소드로-로딩">인스턴스 메소드로 로딩</h4>
<pre><code class="language-java">FXMLLoader loader = new FXMLLoader(getClass().getResources(&quot;xxx.fxml&quot;));
Parent root = (Parent)loader.load();</code></pre>
<ul>
<li><em>getClass()</em> 는 현재 클래스를 리턴한다.</li>
<li><em>getResources()</em> 는 클래스가 위치하는 곳에서 상대 경로로 URL을 리턴한다</li>
<li><em>load()</em> 메소드가 리턴하는 타입은 Parent타입인데. 실 객체는 FXML파일에서 루트 태그로 선언된 컨테이너이다</li>
</ul>
<p>FXML 로딩 후 Parent객체를 얻었다면 다음 코드로 Scene 객체를 생성하면 된다.</p>
<pre><code class="language-java">Scene scene = new Scene(root);</code></pre>
<p>다음은 FXML을 로딩하는 예제이다.</p>
<pre><code class="language-java">//FXMLTest.java
package application.myapp;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class FXMLTest extends Application {

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource(&quot;root.fxml&quot;));
        Scene scene = new Scene(root);
        primaryStage.setTitle(&quot;ji&quot;);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaFX 가이드] 2. 메인 클래스 ]]></title>
            <link>https://velog.io/@j_huuuuns/JavaFX-2.-%EB%A9%94%EC%9D%B8-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@j_huuuuns/JavaFX-2.-%EB%A9%94%EC%9D%B8-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Mon, 16 Jan 2023 06:16:17 GMT</pubDate>
            <description><![CDATA[<h1 id="1-application-구성-요소">1. Application 구성 요소</h1>
<blockquote>
<p>JavaFX는 레이아웃, 스타일, 로직을 분리할 수 있어 디자이너와 개발자들이 협력할 수 있는 구조를 가지고 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/j_huuuuns/post/9a9178f7-bceb-4f25-9db1-4375cc09081f/image.png" alt=""></p>
<h1 id="2-메인-클래스">2. 메인 클래스</h1>
<blockquote>
<p><em><strong>App 실행 순서</strong></em>
<em>launch() -&gt; 생성자 -&gt; init() -&gt; start() -&gt; 사용 -&gt; exit() -&gt; stop() -&gt; 종료</em></p>
</blockquote>
<p>다음은 JavaFX App의 메인 클래스 코드이다.</p>
<pre><code class="language-java">//AppMain.java
public class AppMain extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.show();
    }
}</code></pre>
<p>메인 클래스 실행을 위해선 다음과 같은 단계가 필요하다.</p>
<blockquote>
<ol>
<li>추상 클래스인 javafx.application.Application을 상속</li>
<li><em>start()</em> 메소드 재정의</li>
<li><em>launch()</em> 메소드 호출 </li>
</ol>
</blockquote>
<blockquote>
<p><em><strong>각 메소드별 역할</strong></em> </p>
<ul>
<li><em>launch()</em> -&gt; 메인 클래스 객체, 메인 윈도우 생성, start() 호출</li>
<li><em>start()</em> -&gt; 메인 윈도우 실행 </li>
<li><em>init()</em> -&gt; 매개값을 App이 이용할 수 있게 가져옴 </li>
<li><em>stop()</em> -&gt; App이 종료되기 전 자원 정리 </li>
</ul>
</blockquote>
<h1 id="3-launch-메소드의-스레드-생성">3. launch() 메소드의 스레드 생성</h1>
<blockquote>
<p><em><strong>JavaFX API는 스레드에 안전하지 않다</strong></em></p>
</blockquote>
<p>멀티 스레드가 동시에 UI를 생성하거나 수정하면 문제가 발생한다. 따라서 launch() 메소드는 실행 시 두 개의 스레드를 생성하고 시작시킨다</p>
<ul>
<li>JavaFX-Launcher: <em>init()</em> 실행</li>
<li>JavaFX Application Thread: Stage-UI 생성 및 수정, 입력 이벤트 처리</li>
</ul>
<p>다음 예제는 기본 생성자, <em>init(), start() stop()</em> 메소드가 어떤 스레드에서 실행되는지 보여준다.</p>
<pre><code class="language-java">//ThreadTest.java
public class ThreadTest extends Application {
    public AppMain(){
        System.out.println(Thread.currentThread().getName()+&quot;: 생성자 호출&quot;);
    }
    @Override
    public void init(){
        System.out.println(Thread.currentThread().getName()+&quot;: init() 호출&quot;);
    }
    @Override
    public void start(Stage primaryStage) {
        System.out.println(Thread.currentThread().getName()+&quot;: start() 호출&quot;);
        primaryStage.show();
    }
    @Override
    public void stop(){
        System.out.println(Thread.currentThread().getName()+&quot;: stop() 호출&quot;);
    }
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName()+&quot;: main() 호출&quot;);
        launch(args);
    }
}</code></pre>
<p>실행 결과
<img src="https://velog.velcdn.com/images/j_huuuuns/post/131613dc-38c5-41c3-94c0-fea83c4d56e7/image.png" alt=""></p>
<h1 id="4stage무대-scene장면">4.Stage(무대), Scene(장면)</h1>
<blockquote>
<p><em><strong>윈도우를 Stage로 표현, Stage는 한 번에 하나의 Scene을 가질 수 있다.</strong></em></p>
</blockquote>
<p>메인 Stage는 <em>start()_메소드의 _primaryStage</em> 매개값으로 전달되지만 Scene은 직접 생성해야 한다. Scene은 UI 루트 컨테이너인 javafx.scene.Parent가 필요하다. </p>
<p>Parent는 추상 클래스로, 하위 클래스로 객체를 생성하여 제공해야 한다. 실제로 UI컨트롤이 추가되는 곳은 Parent 가 되고, Parent의 폭과 높이는 Scene과 같다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/a863efca-3d0d-4b0c-a648-db7b90933235/image.png" alt=""></p>
<p>Scene을 생성하는 코드는 다음과 같다.</p>
<pre><code class="language-java">Scene scene = new Scene(Parent root);</code></pre>
<p>Scene 생성 후 Stage에 올릴 땐 <em>setScene()</em> 메소드를 사용한다.</p>
<pre><code class="language-java">primaryStage.setScene(scene);</code></pre>
<p>다음 예제는 VBOX를 이용하여 Scene을 생성하고 Stage에 할당해 실행하는 예제이다.</p>
<pre><code class="language-java">//VBoxApp.java
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class VBoxApp extends Application {
    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox(); //Parent 하위 객체 VBOX생성
        root.setPrefWidth(300); //폭
        root.setPrefHeight(150); // 높이
        root.setAlignment(Pos.CENTER); // 컨트롤 가운데 정렬

        Label label = new Label(); // 라벨 컨트롤 생성
        label.setText(&quot;Java FX&quot;); // text 설정
        label.setFont(new Font(30)); // font 설정

        root.getChildren().add(label); //VBOX의 자식으로 label추가

        Scene scene = new Scene(root); // VBOX를 루트 컨테이너로 하는 Scene 생성
        primaryStage.setScene(scene); // Stage에 Scene할당
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}</code></pre>
<p>실행 결과
<img src="https://velog.velcdn.com/images/j_huuuuns/post/6a7292b9-2453-4720-9f8e-c7574ac24ff8/image.png" alt=""></p>
<p>이 글은
신용권, 『이것이 자바다』, 한빛미디어(2015) 에 기초하여 작성한 글입니다.
<a href="https://github.com/Ra1nBee/JavaFXGuide">깃허브</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaFX 가이드] 1. JavaFX 시작하기]]></title>
            <link>https://velog.io/@j_huuuuns/JavaFX-1.-JavaFX-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@j_huuuuns/JavaFX-1.-JavaFX-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 23 Dec 2022 13:47:51 GMT</pubDate>
            <description><![CDATA[<h1 id="1-javafx의-특징">1. JavaFX의 특징</h1>
<blockquote>
<p><strong><em>JAVA GUI 프로그램 개발을 위한 프레임워크</em></strong></p>
</blockquote>
<ul>
<li>SWING을 대체</li>
<li>하드웨어 가속 지원</li>
<li>크로스 플랫폼 지원</li>
<li>FXML - XML기반의 마크업 언어로 작성하는 UI</li>
<li>CSS를 이용해 디자인 가능</li>
<li>JDK 8 까지는 기본 제공 라이브러리였으나 JDK 11부터 분리됨</li>
</ul>
<h1 id="2-javafx-vs-swing">2. JavaFX vs SWING</h1>
<blockquote>
<p><strong>_JavaFX의 장점 _</strong></p>
</blockquote>
<ul>
<li>AWT/SWING보다 빠름</li>
<li>깔끔하고 현대적인 디자인</li>
<li>FXML을 사용해 코드에서 UI 분리 가능 </li>
<li>WebKit 사용으로 이미지, 사운드 삽입 편리</li>
<li>SWING 어플리케이션과 통합 가능</li>
</ul>
<h1 id="3-javafx-시작하기">3. JavaFX 시작하기</h1>
<blockquote>
<p><em>준비물 : <a href="https://gluonhq.com/products/javafx/">JavaFX SDK</a>, <a href="https://gluonhq.com/products/scene-builder/">SceneBuilder</a></em></p>
</blockquote>
<blockquote>
<p>_ JavaFX 경로: <strong>C:\Program Files\Java\javafx-sdk-19\lib</strong>_
_ SceneBuilder 경로: <strong>C:\Users\사용자명\AppData\Local\SceneBuilder</strong>_</p>
</blockquote>
<h3 id="31-eclipse에서-시작하기">3.1 Eclipse에서 시작하기</h3>
<blockquote>
<p><strong><em>Eclipse 2022-09 / JDK 17.0.5 / JavaFX 19 / SceneBuilder 19.0.0</em></strong></p>
</blockquote>
<p>❌(2022.12.23 기준) Eclipse 2022-12 버전에서 FXML 파일을 생성할 수 없는 <a href="https://github.com/eclipse-efx/efxclipse-eclipse/issues">오류</a>가 보고되었으므로 <strong>2022-09</strong> 버전 설치를 권장합니다.</p>
<ul>
<li><p>Eclipse 상단 메뉴의 [Help-Eclipse MarketPlace...] 를 클릭하고 e(fx)clipse를 설치합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/348540f6-ab37-4fbd-adf3-8d318d18a7aa/image.PNG" alt=""></p>
</li>
<li><p>하단의 프로그래스 바에서 설치 상황을 확인할 수 있습니다. 설치가 끝나면 eclipse를 재시작합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/fc538bd7-009a-4431-8ad2-3881874043c8/image.PNG" alt=""></p>
</li>
<li><p>설치가 완료되면 [File-New-Project...]에서 JavaFX Project를 만듭니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/383af93e-32a3-42c8-8b75-81aed95fec6d/image.PNG" alt=""></p>
</li>
<li><p>프로젝트를 만들었지만 추가적인 설정을 해 주어야 실행 가능합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/ecef594b-e211-418e-aa65-cdf2f9a0e7d5/image.PNG" alt=""></p>
</li>
<li><p>Packege Explorer에서 프로젝트 우클릭 -&gt; [Build Path - Configure Build Path...]을 클릭합니다. Modulepath를 클릭하고 우측의 Add Library를 클릭합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/a2b0f3a4-37d0-42ef-8855-bce13fc91d21/image.PNG" alt=""></p>
</li>
<li><p>User Library -&gt; Next -&gt; User Libraries... -&gt; New를 클릭하고, 라이브러리 이름을 설정합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/d013f367-d36c-431e-90db-2bdbaf3ca6ad/image.PNG" alt=""></p>
</li>
<li><p>파일 탐색기에서 다운로드 받은 JavaFX 파일을 압축을 풀고, [JavaFX-lib] 폴더의 모든 Jar을 선택합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/3abb06fd-afb3-4155-928d-8adc00e10f3e/image.PNG" alt=""></p>
</li>
<li><p>Eclipse가 JavaFX 프로젝트를 실행할 수 있도록 [Run-Run Configurations...]에서 Arguments의 VM arguments에 다음과 같은 명령어를 입력합니다.</p>
<blockquote>
<p><strong>--module-path &quot;[JavaFX lib 위치]&quot; --add-modules=javafx.fxml,javafx.controls</strong></p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/j_huuuuns/post/c183fc84-4c81-44e8-8358-2a3cc8e9d1c0/image.PNG" alt=""></p>
<ul>
<li><p>SceneBuilder를 설치하고 [Window-Preferences] JAVAFX 설정에서 SceneBuilder.exe의 경로를 지정합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/4b3c30a8-4c5b-4914-9863-eb9895bf29bd/image.PNG" alt=""></p>
</li>
<li><p>모든 과정을 완료하면 다음과 같이 실행됩니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/8abd43ca-8bb1-48ce-8381-29d3aab074f2/image.PNG" alt=""></p>
</li>
</ul>
<h3 id="32-intellij에서-시작하기">3.2 IntelliJ에서 시작하기</h3>
<blockquote>
<p><strong><em>IntelliJ 2022.3.1 / JDK 17.0.5 / JavaFX 19 / SceneBuilder 19.0.0</em></strong></p>
</blockquote>
<ul>
<li><p>IntelliJ의 경우 처음부터 JavaFX 프로젝트를 만들 수 있습니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/bb894463-4565-4538-a80c-a6b4974ce2e1/image.PNG" alt=""></p>
</li>
<li><p>초기 프로젝트를 build 후 다음과 같이 실행할 수 있습니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/09797cfd-4924-466f-8448-b6539f3daa6e/image.PNG" alt=""></p>
</li>
<li><p>모듈을 사용하지 않는다면 Module-info.java를 삭제합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/a6e637ad-48fe-43ea-b2e5-40beb6be9f8f/image.png" alt=""></p>
</li>
<li><p>[File-Project Structure-Libraries] 에서 기존 Maven 라이브러리를 모두 삭제합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/d8fb3915-9a1e-4a93-a874-9d9b8e16aa18/image.png" alt=""></p>
</li>
<li><p>+버튼을 눌러 압축을 해제한 JavaFX SDK의 lib폴더를 지정합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/663ee834-c67f-44fa-a5e1-8dd33561c005/image.png" alt=""></p>
</li>
<li><p>[Run - Edit Configurations - Main class] 에서 클래스를 지정합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/732f381b-7706-4333-b4e0-810a01bd7b4b/image.PNG" alt=""></p>
</li>
<li><p>[Modify options - Add VM options] 를 추가하고 다음과 같은 명령어를 입력합니다.</p>
<blockquote>
<p><strong>--module-path &quot;[JavaFX lib 위치]&quot; --add-modules=javafx.fxml,javafx.controls</strong></p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/j_huuuuns/post/0aa859f1-85eb-492e-8da4-6b6c83b8c28b/image.png" alt=""></p>
<ul>
<li><p>좌측 Project View에서 FXML파일 선택 후 Open in SceneBuilder를 클릭하여 Scenebuilder.exe파일의 경로를 지정합니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/549e64dd-a403-4196-8b40-75fe47459cac/image.png" alt=""></p>
</li>
<li><p>모든 과정을 완료하면 다음과 같이 실행됩니다.
<img src="https://velog.velcdn.com/images/j_huuuuns/post/d29949a6-7175-41f8-baf0-0ef672bc6610/image.PNG" alt=""></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>