<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>BuBuck.log</title>
        <link>https://velog.io/</link>
        <description>커피대신 커피(JAVA) 마시기</description>
        <lastBuildDate>Sun, 31 Aug 2025 05:25:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>BuBuck.log</title>
            <url>https://velog.velcdn.com/images/jeongin_1222/profile/26459c34-6162-4d73-93b4-cf0f8ab89dc6/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. BuBuck.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jeongin_1222" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Java Swing 02. JPanel]]></title>
            <link>https://velog.io/@jeongin_1222/Java-Swing-02.-JPanel</link>
            <guid>https://velog.io/@jeongin_1222/Java-Swing-02.-JPanel</guid>
            <pubDate>Sun, 31 Aug 2025 05:25:29 GMT</pubDate>
            <description><![CDATA[<h2 id="jpanel이란">JPanel이란?</h2>
<p><code>JPanel</code>은 <code>Java Swing</code>에서 <strong>컴포넌트들을 그룹으로 묶거나, 그림을 그리는 데 사용되는 가장 기본적인 컨테이너</strong>이다.</p>
<blockquote>
<p>💡 <code>JFrame</code>이 <code>액자라면,</code>JPanel<code>은 그 안에 들어가는 **</code>도화지<code>나</code>게시판`**이라고 생각하면 된다.</p>
</blockquote>
<hr>
<h2 id="jpanel의-주요-특징">JPanel의 주요 특징</h2>
<ul>
<li><p><strong>컨테이너 역할</strong>: <code>JPanel</code>은 그 자체로는 눈에 잘 보이지 않지만, <code>JButton</code>, <code>JLabel</code>, <code>JTextField</code> 등 다른 컴포넌트들을 담아서 그룹으로 괄리할 수 있다.</p>
</li>
<li><p><strong>기본 레이아웃 - FlowLayout</strong>: <code>JFrame</code>의 기본 레이아웃이 <code>BorderLayout</code>인 것과 달리, <strong><code>JPanel</code>의 기본 레이아웃은 FlowLayout</strong>이다.</p>
</li>
<li><p><strong>중첩 구조</strong>: <code>JPanel</code> 안에 또 다른 <code>JPanel</code>을 넣는 식으로 복잡한 화면 레이아웃을 구성할 수 있다.</p>
<blockquote>
<p>예를 들어, 큰 패널(BorderLayout)의 중앙(Center) 구역에 작은 패널(FlowLayout)을 넣어 버튼을 배치하는 식이다.</p>
</blockquote>
</li>
<li><p><strong>커스텀 페인팅</strong>: <code>pointComponent</code> 메서드를 오버라이드(재정의)해서 원하는 도형, 이미지, 캐릭터 등 <strong>자신만의 그래픽을 직접 그리는</strong> 도화지로 사용할 수 있다.</p>
</li>
</ul>
<hr>
<h2 id="자주-사용하는-jpanel-메서드">자주 사용하는 JPanel 메서드</h2>
<h3 id="컴포넌트-관리">컴포넌트 관리</h3>
<ul>
<li><p><strong>add(Component comp)</strong>: 패널 위에 버튼, 레이블 등 다른 컴포넌트를 추가한다.</p>
<pre><code class="language-java">// panel에 &quot;클릭&quot;이라는 텍스트가 적힌 버튼을 추가
panel.add(new JButton(&quot;클릭&quot;));</code></pre>
</li>
<li><p><strong>remove(Conponent comp)</strong>: 패널에 추가된 특정 컴포넌트를 제거한다.</p>
<pre><code class="language-java">// panel에 추가된 myButton을 제거
panel.remove(myButton);</code></pre>
</li>
</ul>
<h3 id="레이아웃-설정">레이아웃 설정</h3>
<ul>
<li><strong>setLayout(LayoutManager mgr)</strong>: 패널 내부의 컴포넌트 배치 방식을 설정한다.<pre><code class="language-java">// panel에 레이아웃을 BorderLayout 방식으로 설정
panel.setLayout(new BorderLayout());</code></pre>
<blockquote>
<p>💡 이제 이 패널을 <strong>동(<code>EAST</code>), 서(<code>WEST</code>), 남(<code>SOUTH</code>), 북(<code>NORTH</code>), 중앙(<code>CENTER</code>)</strong>으로 구역이 나뉘게 된다.</p>
</blockquote>
</li>
</ul>
<h3 id="스타일-및-외형">스타일 및 외형</h3>
<ul>
<li><p><strong>setBackground(Color c)</strong>: 패널의 배경색을 지정한다.</p>
<pre><code class="language-java">// panel에 배경색을 검정색(BLACK)으로 설정
panel.setBackground(Color.BLACK);</code></pre>
</li>
<li><p><strong>setBorder(Border border)</strong>: 패널의 테두리를 설정한다. (디버깅 시 영역 확인에 유용하다)</p>
<pre><code class="language-java">// panel에 테두리를 빨간색(RED)으로 설정
panel.setBorder(BorderFactory.createLineBorder(Color.RED));</code></pre>
<blockquote>
<p>💡 <code>BorderFactory.createLineBorder(Color.RED)</code>는 빨간색 실선 테두리를 만든 코드이다.</p>
</blockquote>
</li>
</ul>
<h3 id="커스텀-드로잉">커스텀 드로잉</h3>
<p>오버라이드용</p>
<ul>
<li><strong>paintComponent(Graphics g)</strong>: 이 메서드를 재정의해서 패널에 그림을 그린다. (직접 호출하지 않음)<pre><code class="language-java">// 기존 JPanel이 가지고 있던 paintComponent라는 메서드를 재정의(Override)함
@Override
protected void paintComponent(Graphics g) {
   // 기존의 JPanel이 하던 기본적인 그리기 작업(배경색 칠하기 등)을 먼저 실행하라는 의미
  super.paintComponent(g);
  // g라는 붓을 사용해서, 패널의 가로 10, 세로 20 위치에 &quot;Hello&quot;라는 글자를 그림
  g.drawString(&quot;Hello&quot;, 10, 20);
}</code></pre>
</li>
</ul>
<p>호출용</p>
<ul>
<li><strong>repaint()</strong>: 패널을 다시 그리도록 시스템에 요청한다. (이 메서드를 호출하면 잠시 후 <code>paintComponent</code>가 실행됨)<pre><code class="language-java">// 시스템이 적절한 타이밍에 재정의한 paintComponent 메서드를 실행 시켜서 화면을 업데이트함
panel.repaint();</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Swing 01. JFrame]]></title>
            <link>https://velog.io/@jeongin_1222/Java-Swing-01.-JFrame</link>
            <guid>https://velog.io/@jeongin_1222/Java-Swing-01.-JFrame</guid>
            <pubDate>Sat, 30 Aug 2025 07:14:20 GMT</pubDate>
            <description><![CDATA[<h2 id="jframe이란">JFrame이란?</h2>
<p><code>JFrame</code>은 <code>Java Swing</code> GUI 라이브러리에서 <strong>화면에 표시되는 창(window)을 만드는데 사용되는 가장 기본적인 구성요소</strong>이다.</p>
<blockquote>
<p>💡 우리가 보는 애플리케이션의 <strong><code>창문</code> 또는 <code>액자</code></strong>와 같은 역할을 한다.</p>
</blockquote>
<hr>
<h2 id="jfrmae의-주요-특징">JFrmae의 주요 특징</h2>
<h3 id="최상위-컨테이너-top-level-container"><strong>최상위 컨테이너 (Top-Level Container)</strong></h3>
<p><code>JFrame</code>은 다른 컨포넌트에 포함되지 않고, 독립적으로 존재할 수 있는 최상위 GUI 컨테이너이다.</p>
<blockquote>
<p>💡 모든 <code>Swing 애플리세이션</code>은 최소 하나 이상의 최상위 컨테이너를 가진다.</p>
</blockquote>
<h3 id="기본-창틀-제공"><strong>기본 창틀 제공</strong></h3>
<p><code>JFrame</code>은 창을 만드는 데 필요한 기본적인 요소들을 이미 갖추고 있다.</p>
<ul>
<li><strong>제목 표시줄(Title Bar)</strong>: 창의 제목을 표시하는 부분</li>
<li><strong>창 조절 버튼</strong>: 최소화, 최대화, 닫기(X) 버튼</li>
<li><strong>콘텐츠 영역 (Content Pane)</strong>: 실제 버튼, 패널 등이 배치되는 내용물 영역</li>
</ul>
<h3 id="상속을-통한-확장">상속을 통한 확장</h3>
<p>보통 <code>JFrmae</code> 클래스를 직접 사용하기보다, <code>JFrmae</code>을 <strong>상속(extends)</strong>하는 새로운 클래스를 만들어 프로그램을 개발한다.
이렇게 하면 원하는 기능과 모양을 가진 자신만의 커스텀 창을 쉽게 만들 수 있다.</p>
<hr>
<h2 id="jframe-핵심-설정-메소드">JFrame 핵심 설정 메소드</h2>
<h3 id="창-기본-설정">창 기본 설정</h3>
<ul>
<li><p><strong>setTitle(String title)</strong>: 창의 제목 표시줄에 나타날 텍스트를 설정한다.</p>
<pre><code class="language-java">// 창의 제목을 Hello Swing! 으로 설정
setTitle(&quot;Hello Swing!&quot;);</code></pre>
</li>
<li><p><strong>setSize(int width, int height)</strong>: 창의 <code>가로(width)</code>와 <code>세로(height)</code> 크기를 픽셀 단위로 설정한다.</p>
<pre><code class="language-java">// 창의 크기를 가로: 800, 세로: 600 으로 설정
setSize(800, 600);</code></pre>
</li>
<li><p><strong>setLocationRelativeTo(Component c)</strong>: 창이 나타날 위치를 설정합니다.</p>
<pre><code class="language-java">// 창이 나타날 위치를 화면 중앙으로 설정
setLocationRelativeTo(null);</code></pre>
<blockquote>
<p>💡 <code>null</code> 대신 다른 GUI 컴포넌트 객체를 전달하면, 새로 뜨는 창이 해당 컴포넌트의 중앙에 맞춰서 나타난다.</p>
</blockquote>
</li>
<li><p><strong>setVisible(boolean b)</strong>: 창을 화면에 보이거나(true) 숨길(false) 때 사용한다.</p>
<pre><code class="language-java">// 창을 화면에 보이게 설정
setVisible(true);</code></pre>
</li>
</ul>
<h3 id="창-닫기-동작">창 닫기 동작</h3>
<ul>
<li><strong>setDefaultCloseOperation(int operation)</strong>: 창의 닫기 버튼(X)을 눌렀을 때의 동작을 정의한다.<pre><code class="language-java">// 창의 닫기 버튼(X)을 눌렀을 때 프로그램을 완전히 종료하게 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</code></pre>
<h4 id="동작">동작</h4>
<ul>
<li><strong>JFrame.EXIT_ON_CLOSE</strong>: 프로그램을 완전히 종료</li>
<li><strong>JFrame.DISPOSE_ON_CLOSE</strong>: 현재 창만 닫고 프로그램은 계속 실행</li>
<li><strong>JFrame.HIDE_ON_CLOSE</strong>: 창을 보이지 않게 숨김</li>
<li><strong>JFrame.DO_NOTHING_ON_CLOSE</strong>: 닫기 버튼을 눌러도 아무 동작도 하지 않음</li>
</ul>
</li>
</ul>
<h3 id="컴포넌트-관리">컴포넌트 관리</h3>
<ul>
<li><p><strong>add(Component comp)</strong>: 버튼(JButton), 패널(JPanel) 등 다른 GUI 컴포넌트를 프레임에 추가한다.</p>
<pre><code class="language-java">// 창에 WindowPanel을 추가
add(new WindowPanel());</code></pre>
</li>
<li><p><strong>setLayout(LayoutManager manager)</strong>: 컴포넌트들이 프레임안에서 배치되는 방식을 결정한다. (기본값: BorderLayout)</p>
<pre><code class="language-java">// 창 안에 컴포넌트들이 배치되는 방식을 FlowLayout으로 설정
setLayout(new FlowLayout());</code></pre>
<blockquote>
<p>💡 레이아웃 매니저에는 <code>BorderLayout</code>, <code>FlowLayout</code>, <code>GridLayout</code>, <code>CardLayout</code>, <code>BoxLayout</code> 등이 있다.</p>
</blockquote>
</li>
</ul>
<h3 id="기타-유용한-설정">기타 유용한 설정</h3>
<ul>
<li><p><strong>setResizable(boolean resizable)</strong>: 사용자가 마우스로 창 크기를 조절 할 수 있는지 여부를 설정한다. (최대화 불가)</p>
<pre><code class="language-java">// 창 크기를 조절 할 수 없게 설정
setResizable(false);</code></pre>
</li>
<li><p><strong>pack()</strong>: 프레임 안에 추가된 컴포넌트들의 크기에 맞춰 프레임 크기를 자동으로 조절한다.</p>
</li>
<li><p><strong>getContentPane()</strong>: 컴포넌트들이 실제 추가되는 영역(Content Pane)을 가져온다.</p>
<pre><code class="language-java">// 창의 배경색을 BLACK(검은색)으로 설정
getContentPane().setBackground(Color.BLACK);</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Swing 00. "Hello Swing!"]]></title>
            <link>https://velog.io/@jeongin_1222/Java-Swing00.-Hello-Swing</link>
            <guid>https://velog.io/@jeongin_1222/Java-Swing00.-Hello-Swing</guid>
            <pubDate>Fri, 29 Aug 2025 12:39:35 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="시작하기에-앞서">시작하기에 앞서...</h2>
<blockquote>
<p><code>Java</code> 언어로 게임을 만들고 싶어진 저는 <code>Java</code>로 게임을 만드는 영상들을 찾아보았습니다. 찾아본 결과 먼저 <code>Swing</code>이란 <code>GUI 라이브러리</code>를 사용한다는 것을 알고 <code>Java Swing</code>에 관해 공부하려고 합니다. </p>
</blockquote>
<hr>
<h2 id="개발-환경-설정">개발 환경 설정</h2>
<blockquote>
<p><strong>개발 환경 : macOS / IntelliJ IDEA / JDK 17 버전 사용</strong></p>
</blockquote>
<h3 id="1-프로젝트-생성">1. 프로젝트 생성</h3>
<p><img src="https://velog.velcdn.com/images/jeongin_1222/post/1084f3b6-7df1-4155-ae52-ff60925b4047/image.png" alt="">
IntelliJ에서 <strong><code>JavaSwing</code></strong> 라는 이름으로 새 Java 프로젝트를 생성합니다.</p>
<h3 id="2-패키지-생성">2. 패키지 생성</h3>
<p><strong><code>swing00</code></strong> 라는 이름으로 새 패키지를 생성한다.</p>
<p><img src="https://velog.velcdn.com/images/jeongin_1222/post/e03ef697-d69f-4b13-821e-52f3fa72eec5/image.png" alt=""></p>
<h3 id="3-클래스-생성">3. 클래스 생성</h3>
<p><code>main</code> 메서드를 포함하는 <strong><code>Launcher</code></strong> 클래스와 <strong><code>MainWindow</code></strong> 클래스 두 개를 생성한다.</p>
<p><img src="https://velog.velcdn.com/images/jeongin_1222/post/91b7f6c6-ac6b-4fdf-a394-0ebf65023aa0/image.png" alt=""> <img src="https://velog.velcdn.com/images/jeongin_1222/post/a69ab0eb-6d9c-4350-8fc2-e0e3121cc34d/image.png" alt=""></p>
<hr>
<h2 id="클래스-구현">클래스 구현</h2>
<h3 id="1-launcher-클래스-구현">1. Launcher 클래스 구현</h3>
<pre><code class="language-java">package swing00;

import javax.swing.*;

public class Launcher {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -&gt; new MainWindow().setVisible(true));

    }
}</code></pre>
<p><code>Launcher</code> 클래스에서 <code>SwingUtilities.invokeLater()</code> 메서드를 사용하여 <code>Swing</code> 관련 코드가 <code>EDT(Event Dispatch Thread)</code>에서 실행되도록 한다.</p>
<blockquote>
<ul>
<li><strong><code>SwingUtilities.invokeLater()</code> 메서드를 사용하는 이유는 무엇인가?</strong>
  Swing 스레드는 안전하지 않으므로, 모든 Swing 관련 코드가 EDT라는 동일한 스레드에서 실행되도록 보장하기 위해 사용한다.</li>
</ul>
</blockquote>
<ul>
<li>EDT(Event Dispatch Thread): <strong>Swing GUI 애플리케이션의 모든 화면 관련 작업을 전담하는 유일한 스레드</strong>이다.</li>
</ul>
<h3 id="2-mainwindow-클래스-구현">2. MainWindow 클래스 구현</h3>
<pre><code class="language-java">package swing00;

import javax.swing.*;

public class MainWindow extends JFrame {

    public MainWindow() {
        // 창 제목 설정
        setTitle(&quot;Hello Swing!&quot;);

        // 기본 닫기 동작 설정
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 창 크기 설정
        setSize(800, 500);

        // 창 화면 중앙 배치
        setLocationRelativeTo(null);
    }

}</code></pre>
<p><code>MainWindow</code> 클래스는 <code>JFrame</code>을 상속 받았기 때문에 클래스 자체가 프레임의 한 종류라고 볼 수 있다.</p>
<p>생성자 내에서 프레임을 설정해준다.</p>
<hr>
<h2 id="프로그램-실행-및-결과-확인">프로그램 실행 및 결과 확인</h2>
<p><img src="https://velog.velcdn.com/images/jeongin_1222/post/fc20d72e-761d-4306-8f86-85311f2ecb9e/image.png" alt=""></p>
<p>이렇게 모니터 화면의 정중앙에 800 x 500 크기의 &quot;Hello Swing!&quot;이라는 제목의 창이 화면에 나타난 것을 확인할 수 있다.</p>
]]></description>
        </item>
    </channel>
</rss>