Sponsored By
















계산기 만들기를 이어서 해보겠다.

 

이전 포스팅에서 GUI형태의 계산기 모양을 만들었으니 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이벤트처리해서 만든 계산기를 작동시켜 보겠다.

 

 

 

 

 

 

 

 

00_1. ActionListener를 확장시켜 사용한다.







00_2. Debug버튼을 눌렀을 때 작동 시킬 것이므로 다음과같이 버튼에 연결시켜준다.







00_3. 마우스오른쪽버튼'-> 'Source'-> 'Override and Implement Methods' 로 actionPerformed메소드를 오버라이드 시킨다.

 

 

 

 

 

01_1. 안에다 코딩을 해서 먼저 버튼을 눌렀을때 텍스트를 바꿔주도록 해보자.







01_2. 바꿔지는 것을 확인할 수 있다.







02_1. 버튼을 누를때마다 바뀌도록 해보자. 객체를 비교할때는 'void equals();' 임을 기억하자.







02_2. 계속 바뀌는 것을 확인할 수 있다.







03_1. 응용해서 버튼을 누르면 1로 바뀌게 해보자. 실제로는 button1에 연결시켜서 사용하자.







03_2. 1이 입력됨을 확인할 수 있다.







03_3. 계속 누르면 1이 계속 쓰여짐을 확인할 수 있다.

 

 

 

 

 

※. 코드

 

 

import java.awt.BorderLayout;

import java.awt.FlowLayout;

import java.awt.Font;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

 

 

class MyFrame extends JFrame implements ActionListener {  // components는 전부 밖에서 선언해줘야 안에서 사용할 수 있으므로 좋음.

 

JPanel displayPanel;

JPanel buttonPanel;

JPanel debugPanel;

 

JTextField display;

 

JButton[] buttons;  // 0 ~ 9 까지 10개의 버튼을 배열로 써서 만들거임.

JButton btnPlus;

JButton btnMinus;

JButton btnProduct;  // Multiply 

JButton btnDivide;

JButton btnEqual;

JButton btnCE;

 

JButton btnDebug;

JLabel debugMsg;

 

 

public MyFrame()

{

this.setSize(300,400);

this.setTitle("GUI Test");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

 

this.setLayout( new BorderLayout() );

 

// 3개의 panel 객체를 만들고 각자 layout 을 설정해보겠다.

displayPanel = new JPanel();

buttonPanel = new JPanel();

debugPanel = new JPanel();

 

displayPanel.setLayout( new FlowLayout() );

buttonPanel.setLayout( new GridLayout(0, 4, 5, 5) );

debugPanel.setLayout(new FlowLayout());

 

 

/* display 관련 */

 

// display 에 있는 panel에 component를 만들어서 붙이겠다.

display = new JTextField(11);  // 글자수가 '11자'가 들어가게 하겠다.

display.setText("0");  // 초기 계산기 화면을 0으로 써놓겠다.

display.setHorizontalAlignment(JTextField.RIGHT);  // field 내 글씨를 오른쪽정렬.

Font font = new Font("Serif", Font.BOLD, 30);  // ※ Serif ; 삐침이 나와있는 글씨체. san serif ; non 삐침.

display.setFont(font);

 

// displayPanel 에다가 display component를 붙인다.

displayPanel.add(display);

 

 

 

/* 버튼 관련 */

 

Font fontBtn = new Font("Serif", Font.BOLD, 30);  // 버튼에도 폰트를 주고싶어서 객체생성.

 

 

// buttonPanel 에 component 만들고 붙이기.

buttons = new JButton[10];  // array 메모리만 만들어진것이다.

 

// 실제 버튼 객체 생성하기.

for (int i = 0 ; i < buttons.length ; i++)

{

//buttons[i] = new JButton(""+i);  // i 를 String 값으로 받고싶다.

buttons[i] = new JButton(Integer.toString(i));  // i 를 String 값으로 받고싶다.

buttons[i].setFont(fontBtn);  // 버튼의 폰트에 대한 지정

}

 

btnPlus = new JButton("+");

btnMinus = new JButton("-");

btnProduct = new JButton("*");

btnDivide = new JButton("/");

btnEqual = new JButton("=");

btnCE = new JButton("CE");

 

// 1 2 3 +

// 4 5 6 -

// 7 8 9 *

// 0 / = CE      의 형태로 만들고 싶다.

 

buttonPanel.add(buttons[1]);

buttonPanel.add(buttons[2]);

buttonPanel.add(buttons[3]);

buttonPanel.add(btnPlus);

 

buttonPanel.add(buttons[4]);

buttonPanel.add(buttons[5]);

buttonPanel.add(buttons[6]);

buttonPanel.add(btnMinus);

 

buttonPanel.add(buttons[7]);

buttonPanel.add(buttons[8]);

buttonPanel.add(buttons[9]);

buttonPanel.add(btnProduct);

 

buttonPanel.add(buttons[0]);

buttonPanel.add(btnDivide);

buttonPanel.add(btnEqual);

buttonPanel.add(btnCE);

 

//debugPanel 에 debugMsg 와 btnDebug 를 만들어서 붙이겠다.

debugMsg = new JLabel("Start Debug");

debugMsg.setToolTipText("Hello World");  // 마우스를 debugMsg 위에 올려놓으면 Text 가 말풍선 형태로 출력.

btnDebug = new JButton("Debug Button");

 

btnDebug.addActionListener(this);  // 리스너를 이벤트소스에 등록한다. (항상 이 형식으로 사용하면 된다.)

 

debugPanel.add(debugMsg);

debugPanel.add(btnDebug);

//btnDebug.setEnabled(false);

 

 

 

 

 

// frame에다가 panel들 붙이기.

this.add(displayPanel, BorderLayout.NORTH);

this.add(buttonPanel, BorderLayout.CENTER);

this.add(debugPanel, BorderLayout.SOUTH);

 

//debugPanel.setVisible(false);

String msg = debugMsg.getText();

System.out.println(msg);

 

//this.pack();

 

this.setVisible(true);

 

 

}// MyFrame Method

 

@Override

public void actionPerformed(ActionEvent e) {

 

if(e.getSource() == btnDebug)

{

//System.out.println("btnDebug is Clicked.!");

//debugMsg.setText("Hello World.");

 

if(debugMsg.getText().equals("Start Debug"))  // 객체들의 비교는 == 가 아니라 .equal 객체(String)와 객체를 비교할때.

{

debugMsg.setText("Hello World.");

}else{

debugMsg.setText("Start Debug");

}

}

 

 

//1번 버튼이라고 가정하고 0을 1로 바꿔보자.(display 값이 0이기 때문에)

// 현재 display 값이 '0'이면

// display.setText("1")

// else

// 현재 디스플레이값 display.getText() + "1"

 

if (display.getText().equals("0"))

{

display.setText("1");

}else

{

display.setText( display.getText() + "1");

}

 

 

 

 

}

 

}// MyFrame Class

 

 

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame();

 

 

}// main

 

}// Main Class

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GUI형태의 계산기를 만들어보겠다. 

 

 

 

 

 

 

 

먼저, 형태를 만들고 이벤트를 사용하여 구동시키도록 하겠다.

 

 

 

 

 

 

 

00_1. 아래와같이 객체를 생성하고 그위에 판넬을 깔아주고 판넬을 각각 알맞게 레이아웃을 지정해준다. 

그 레이아웃 위에 component들을 부착(add)시킨후 실행시켜보자.







00_2. 계산기 모양의 GUI창이 나타난다.

 

 

 

 

 

 

01. 계산기 GUI창 하단에 디버그 하는곳은 안보이도록 'debugPanel.setVisivle(false);' 로 안보이게 가려준다.

    하지만, 가려주기만 했지 구동은 잘 됨을 확인하기위해 'System.out.printlk();' 을 써서 출력을 해보자.








02. 버튼을 활성/비활성화 시킬 수 도있다. 'void setEnable(ture/false);' 를 사용하여 활성/비활성화를 시도해보자.

 

 

 

 

 

레이아웃 중 그리드/격자레이아웃(GridLayout) 사용 방법에 대해 알아보겠음. 

 

 

 

 

 

 

ㅁ. Layout 은 다음과 같이 나뉘고 각 특성을 같으므로 적절하게 사용하면 된다. 

FlowLayout 은 가운데를 중심으로 배치.

BorderLayout 은 가운데를 중심으로 동서남북으로 배치.

GridLayout (행, 열); - 0을 기입하면 auto.!!! 

  ; (예, gridLayout(0,2) 로 만들면 2열이 넘어가는 데이터가 3열로 오면 자동으로 다음행1열로 간다. )

BoxLayout ; 한칸(행)에 하나씩 차지하도록 하는 배치.

 

 

ㅁ. 판넬로 주로 쓰이기 때문에 판넬을 만들고 default레이아웃을 생각하지말고 Layout을 만들어준다고 생각하면됨. 

 

 

 

 

 

 

 

 

00. 격자레이아웃(GridLayout) 은 격자처럼 들어가게 하는 레이아웃이다.







01. 객체생성시 new GridLayout(행, 열, 수평gap, 수직gap) 임이 적용됨을 확인할 수 있다.

 

 

 

 

 

 

※. 코드

 

 

import java.awt.GridLayout;

 

import javax.swing.JButton;

import javax.swing.JFrame;

 

class MyFrame extends JFrame{

public MyFrame()

{

this.setSize(500,300);

this.setTitle("GUI Test");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

// this.setLayout( new GridLayout(0,3) );  // 자동행 + 3열 짜리 격자레이아웃

this.setLayout( new GridLayout(0, 3, 5, 20) );  // 행, 열, 수평gap, 수직gap

 

JButton button1 = new JButton("Button1");

JButton button2 = new JButton("Button2");

JButton button3 = new JButton("Button3");

JButton button4 = new JButton("Button4");

JButton button5 = new JButton("Button5");

 

this.add(button1);

this.add(button2);

this.add(button3);

this.add(button4);

this.add(button5);

 

this.pack();

 

 

this.setVisible(true);

 

 

}

}// MyFrame Class

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame();

 

 

}// main

 

}// Main Class

 

 

 

 

 

레이아웃 중 보더레이아웃(BorderLayout) 사용 방법에 대해 알아보겠음. 

 

 

 

 

 

 

ㅁ. Layout 은 다음과 같이 나뉘고 각 특성을 같으므로 적절하게 사용하면 된다. 

FlowLayout 은 가운데를 중심으로 배치.

BorderLayout 은 가운데를 중심으로 동서남북으로 배치.

GridLayout (행, 열); - 0을 기입하면 auto.!!! 

  ; (예, gridLayout(0,2) 로 만들면 2열이 넘어가는 데이터가 3열로 오면 자동으로 다음행1열로 간다. )

BoxLayout ; 한칸(행)에 하나씩 차지하도록 하는 배치.

 

 

ㅁ. 판넬로 주로 쓰이기 때문에 판넬을 만들고 default레이아웃을 생각하지말고 Layout을 만들어준다고 생각하면됨. 

 

 

 

 

 

 

 

 

 

00. 보더레이아웃(borderlayout)은 다음과 같이 구동시켰을 때, 중심으로 잡혀서 동서남북으로 나뉘어진다.







01. 센터와 동서남북으로 각 버튼을 배치시켜 보았다.

 

 

 

 

 

 

※. 코드

 

 

import java.awt.BorderLayout;

 

import javax.swing.JButton;

import javax.swing.JFrame;

 

class MyFrame extends JFrame{

public MyFrame()

{

this.setSize(500,300);

this.setTitle("GUI Test");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

//BorderLayout 으로 setting 하기

 

//BorderLayout layout = new BorderLayout();

//this.setLayout(layout);

 

this.setLayout( new BorderLayout() );

 

 

 

JButton button1 = new JButton("Button1");

JButton button2 = new JButton("Button2");

JButton button3 = new JButton("Button3");

JButton button4 = new JButton("Button4");

JButton button5 = new JButton("Button5");

 

this.add(button3, BorderLayout.CENTER);

this.add(button1, BorderLayout.NORTH);

this.add(button2, BorderLayout.WEST);

this.add(button4, BorderLayout.EAST);

this.add(button5, BorderLayout.SOUTH);

 

//this.pack();  // Frame 을 가장 tight하게 만듬.  

 

this.setVisible(true);

 

 

}

}// MyFrame Class

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame();

 

 

}// main

 

}// Main Class

 

 

 

레이아웃 중 플로우레이아웃(FlowLayout) 사용 방법에 대해 알아보겠음. 

 

 

 

 

 

 

ㅁ. Layout 은 다음과 같이 나뉘고 각 특성을 같으므로 적절하게 사용하면 된다. 

FlowLayout 은 가운데를 중심으로 배치.

BorderLayout 은 가운데를 중심으로 동서남북으로 배치.

GridLayout (행, 열); - 0을 기입하면 auto.!!! 

  ; ( 예, gridLayout(0,2) 로 만들면 2열이 넘어가는 데이터가 3열로 오면 자동으로 다음행1열로 간다. )

BoxLayout ; 한칸(행)에 하나씩 차지하도록 하는 배치.

 

 

ㅁ. 판넬로 주로 쓰이기 때문에 판넬을 만들고 default레이아웃을 생각하지말고 Layout을 만들어준다고 생각하면됨. 

 

 

 

 

 

 

 

 

 

00. 플로우레이아웃(Flowlayout)은 다음과 같이 구동시켰을 때, 프레임이 작으면 아래로 흘러 넘치는 모양이 됨.

 

 

 

 

 

 

※. 코드

 

 

import java.awt.FlowLayout;

 

import javax.swing.JButton;

import javax.swing.JFrame;

 

class MyFrame extends JFrame{

 

public MyFrame()

{

this("No Title");

}

 

public MyFrame(String title)

{

this.setSize(300,300);

this.setTitle(title);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

// Programming here

 

// Layout Set - FlowLayout 쓰겠다.

FlowLayout layout = new FlowLayout();

this.setLayout(layout);  // = MyFrame(=this) 에다 FlowLayout 을 setting 하겠다. 

 

 

JButton button1 = new JButton("Test button1");

JButton button2 = new JButton("Test button2");

JButton button3 = new JButton("Test button3");

 

this.add(button1);

this.add(button2);

this.add(button3);

 

//this.pack();  // 버튼들 크기에 딱 맞게 pack을 한다.

 

this.setVisible(true);

 

}

}// MyFrame Class

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame("FlowLayout Test");

 

 

}// main

 

}// Main Class

 

 

 



Sponsored By















+ Recent posts