SW

JAVA GUI 기초 다지기 2 본문

프로그래밍/JAVA

JAVA GUI 기초 다지기 2

LCD 2018. 10. 23. 18:37

 배치 관리자 (Layout manager)

버튼이나 텍스트 필드 등의 컴포넌트들은 컨테이너 내부에 배치된다.
컨테이너 내부의 어떤 위치에 어떤 크기로 배치되는가를 프로그래머가 절대 좌표값으로 구체적으로 지정할 수 있다. 그러나 이 방법은 단점을 갖고 있다.
자바 프로그램은 다양한 플랫폼에서 실행될 수 있고 따라서 플랫폼 마다, 화면의 크기가 다를 수 있다. 따라서 절대 위치를 사용하여 컴포넌트들이 배치 될 경우 프로그래머가 의도한 바와는 다르게 출력 될 수 있다.

이런 문제점을 해결하기 위하여 자바에서 컴포넌트의 배치를 배치 관리자를 사용하여 자동화 한다. 


이 전 글에 있는 FlowLayout, BorderLayout, GridLayout 이다. 


설정하는 방법은 저번에 작성 한 것과 동일하다.






이런 식으로 사용된다. 


프로그래머가 컴포넌트의 크기와 힌트를 배치 관리자에게 주고 싶은 경우에는 setMinimumSize(), setPreferredSize(), setMaximumSize()메소드를 사용할 수 있다. 정렬에 대한 힌트를 주려면 setAlignmentX(), setAlignmentY(), 메소드를 이용한다.




배치 관리자 없이도 컴포넌트를 배치할 수 있다. 하지만 사용하는 것이 좋다.

배치 관리자는 플랫폼이나 룩앤필의 변경에 따른 컴포넌트의 외관 변경이나 폰트의 크기, 컨테이너의 크기 변경에 쉽게 적응한다.


아무튼 절대값 좌표로 컴포넌트들을 사용하기 위해선


setLayout(null); 을 설정한다.


그리고 난뒤 add()메소드를 사용하여 컨테이너에 컴포넌트를 추가한다.


Button b = new JButton("Button #1"");

add(b);



setSize(x,y) 와 setLocation(x,y)을 사용하여 컴포넌트의 위치와 크기를 지정한다. 아니면 setBounds()를 사용하여 위치와 크기를 동시에 지정하여도 된다.


b.setBounds( x, y, w, h);


이런 식으로 지정하면 x,y좌표와 가로 세로 좌표를 한번에 입력할 수 있다.









이제 레이아웃도 완벽히 익혔겠다. 다시 한번 어서와 자바는 처음이지? 의 예제문제를 사용해서 연습해보자



import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.GridLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.UIManager;


public class test extends JFrame {


private JPanel panel;

private JTextField field;

private JButton[] buttons;

private String[] labels = {"Backspace","","","CE","C","7","8","9","/","sqrt","4","5","6","X","%","1","2","3","-","1/X","0","+/x",".","+","="};

public test(){

try {

   UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );

} catch (Exception e) {

           e.printStackTrace();

   

}

field = new JTextField();

panel = new JPanel();

field.setText("0.");

field.setEnabled(false);

panel.setLayout(new GridLayout(0,5,3,3));

buttons = new JButton[25];

int index = 0; 

for(int rows = 0; rows < 5; rows++) {

for(int cols = 0; cols < 5; cols++) {

buttons[index] = new JButton(labels[index]);

if(cols >= 3) {

buttons[index].setForeground(Color.RED);

}

else {

buttons[index].setForeground(Color.blue);

}

buttons[index].setBackground(Color.YELLOW);

panel.add(buttons[index]);

index++;

}

}

add(field, BorderLayout.NORTH);

add(panel, BorderLayout.CENTER);

setVisible(true);

pack();

}

public static void main(String[] args) {

test ts = new test();

}

}



헉헉.. 결과 물이다.




위 코드는 책에 그대로 적혀 있지만 예외처리만 살짝 추가하였다.


본 주인장은.. 맥을 사용하고 있는데.. 맥에선 그냥 색을 넣으려고 하면 색이 들어가질 않는다!!


우리의 친한 칭구 구글에게 여러번 질문을 반복하였다.


그래도 찾기가 너무 힘들어서 https://stackoverflow.com 사이트에서 계속 찾다가 결국 찾았다..


try {

    UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );

 } catch (Exception e) {

            e.printStackTrace();    

  }



로 예외 처리해서 룩앤필, UI매니저를 사용해야 되는가 보다.... 

버튼에 색이 계속 안들어가서 아래의 문구도 써봤었다.

UIManager.put("Button.background", Color.YELLOW);

진짜 경우의 수를 다 해본 것 같다.. 아직까지 완벽히 이해하진 못하였지만 아무튼!!! 성공했다.


맥쓰는 유저들이 참고가 되었으면 하는 마음에 남겨본다~




바로 다음 공부를 시작하자.


똑같이 어서와 자바는 처음이지? 책의 예제를 그대로 사용하였다.


화면에 난수를 표시하는 프로그램을 작성해보자!!



난수를 발생시켜 레이블을 불규칙하게 배치해보자. 어떤 배치 관리자를 사용해야 되는지 생각해보면 정말 간단하다.

우선 절대위치 좌표를 설정할 수 있는 setBounds()를 사용하거나 setSize(), setLocation()을 함께 사용한다. 

또 난수는 모두가 알고 있을 것이다. Math.random()으로 발생시키면 가능하다.




import java.awt.Color;


import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;



public class test extends JFrame {


JPanel panel = new JPanel();

JLabel[] label = new JLabel[30];

public test(){

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setTitle("화면 난수 표시기");

panel.setLayout(null);

panel.setBackground(Color.yellow);

for(int i=0; i<30; i++) {

label[i] = new JLabel("" + i);

int x = (int)(500 * Math.random());

int y = (int)(200 * Math.random());

label[i].setForeground(Color.MAGENTA);

label[i].setLocation(x, y);

label[i].setSize(20,20);

panel.add(label[i]);

}

setSize(500,300);

add(panel);

setVisible(true);

}

}




public class View {


public static void main(String[] args) {


test view = new test();

}


}



결과 값이다. 정말 멍청하게 본 주인장은 전부다 패널에 넣어 놓고 정작 패널을 JFrame에 추가를 안해서 찾느라 고생하였다.

오류가 뜨지 않아서.. 찾는 시간을 걸리게 만드는 단점이 있으니 항상 주의를 하자...


그럼 그렇지 컴퓨터는 잘못 없어 ㅜㅜ 못난 사용자가 잘못한 거지 ㅜㅜ





아무튼!! 여기까지 끝내도록 하자. 



다음 장은 인터페이스, 람다식, 패키지 챕터이다. 열심히 공부하자 ㅜㅜㅜ


































'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] String Lib  (0) 2019.06.07
JAVA GUI 기초 다지기  (2) 2018.10.22