컴퓨터 프로그래밍

자바 GUI (그래픽 유저 인터페이스) 프로그래밍 [2]

THINK_PRO 2015. 2. 18. 05:04

자바 GUI (그래픽 유저 인터페이스) 프로그래밍 [1]

에 이어서 조금은 더 고급(?) 스러운 예제를 다뤄 볼까 합니다.

앞서 다룬 예제는 솔직히.. 예제랄것도 없었죠?

그냥 프레임 클래스와 패널 클래스등을 사용하여 단순히 GUI 윈도우를 띄어보는 수준에 그쳤는데요.

이번 글에서는 조금 더 나아가서 버튼을 사용하고, 버튼을 눌러서 상호작용하는 아주 간단한 예제까지 다뤄보고자 합니다.


Content Pane과 Panel에 대한 설명이 이전 포스팅에서 다 되었기 때문에 기초 지식은 다 안다고 생각합니다.

따라서, 바로 예제 코드를 보는 것이 더 좋을 것 같네요


import javax.swing.*;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


public class ButtonDemo implements ActionListener {

int redScoreAmount = 0;

int blueScoreAmount = 0;

JPanel titlePanel, scorePanel, buttonPanel;

JLabel redLabel, blueLabel, redScore, blueScore;

JButton redButton, blueButton, resetButton;

public JPanel createContentPane() {

/* total panel */

JPanel totalGUI = new JPanel();

totalGUI.setLayout(null);

/* titel panel */

titlePanel = new JPanel();

titlePanel.setLayout(null);

titlePanel.setLocation(10, 0);

titlePanel.setSize(250, 30);

totalGUI.add(titlePanel);

redLabel = new JLabel("Red Team");

redLabel.setLocation(0, 0);

redLabel.setSize(100, 30);

redLabel.setHorizontalAlignment(0);

redLabel.setForeground(Color.red);

titlePanel.add(redLabel);

blueLabel = new JLabel("Blue Team");

blueLabel.setLocation(120, 0);

blueLabel.setSize(100, 30);

blueLabel.setHorizontalAlignment(0);

blueLabel.setForeground(Color.blue);

titlePanel.add(blueLabel);

/* score panel */

scorePanel = new JPanel();

scorePanel.setLayout(null);

scorePanel.setLocation(10, 40);

scorePanel.setSize(250, 30);

totalGUI.add(scorePanel);

redScore = new JLabel("0");

redScore.setLocation(0, 0);

redScore.setSize(100, 30);

redScore.setHorizontalAlignment(0);

scorePanel.add(redScore);

blueScore = new JLabel("0");

blueScore.setLocation(120, 0);

blueScore.setSize(100, 30);

blueScore.setHorizontalAlignment(0);

scorePanel.add(blueScore);

/* button panel */

buttonPanel = new JPanel();

buttonPanel.setLayout(null);

buttonPanel.setLocation(10, 80);

buttonPanel.setSize(250, 70);

totalGUI.add(buttonPanel);

redButton = new JButton("Red Score!");

redButton.setLocation(0, 0);

redButton.setSize(100, 30);

redButton.addActionListener(this);

buttonPanel.add(redButton);

blueButton = new JButton("Blue Score!");

blueButton.setLocation(120, 0);

blueButton.setSize(100, 30);

blueButton.addActionListener(this);

buttonPanel.add(blueButton);

resetButton = new JButton("Reset Score");

resetButton.setLocation(0, 40);

resetButton.setSize(220, 30);

resetButton.addActionListener(this);

buttonPanel.add(resetButton);

totalGUI.setOpaque(true);

return totalGUI;

}


private static void createAndShowGUI() {

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame = new JFrame("[=] JButton Score! [=]");

ButtonDemo demo = new ButtonDemo();

frame.setContentPane(demo.createContentPane());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(250, 190);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {


@Override

public void run() {

// TODO Auto-generated method stub

createAndShowGUI();

}

});

}


@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

Object obj = e.getSource();

if (obj == redButton) {

++redScoreAmount;

redScore.setText("" + redScoreAmount);

} else if (obj == blueButton) {

++blueScoreAmount;

blueScore.setText("" + blueScoreAmount);

} else if (obj == resetButton) {

redScoreAmount = 0;

blueScoreAmount = 0;

redScore.setText("" + redScoreAmount);

blueScore.setText("" + blueScoreAmount);

}

}

}


결과물



코드가 갑자기 너무 방대해졌나요? 실은 큰 의미가 있는 코드들은 그닥 길지 않습니다. 찬찬히 읽어보시면 충분히 이해가 갈겁니다.

일단, 당연히 프로그램이 실행되면 main 메서드가 호출이 될 것이고, 

createAndShowGUI() 메서드를 호출하는 구문을 볼 수 있을 것입니다.

createAndShowGUI에서는 이 프레임의 ContentPane을 createContentPane 메서드로 반환하도록 하였는데요. 

그 메서드가 바로 맨 위에 길다란 메소드 구문입니다.

또, createContentPane 메서드에서 버튼 구성요소들에게는 addActionListener(this) 메서드로 액션 리스너를 설정하였는데요.

액션 리스너는 그 버튼이 클릭될 경우 actionPerformed 메서드를 호출하도록 하는 리스너입니다.


디스플레이 구성요소에는 크게 세 부분이 있는데요. 타이틀 패널, 스코어 패널, 버튼 패널이 있습니다.