오늘 포스팅 할 내용은 Android LinearLayout과 비슷한 Java의 Swing LinearLayout Manager 입니다.
Java가 기본적으로 제공하는 레이아웃은 아래와 같습니다.
"FlowLayout, BorderLayout, GirdLayout, BoxLayout, GridBagLayout"
우리는 GUI를 만들때, 버튼이나 라벨같은 컴포넌트들이 수직 정렬로 배치 되는걸 선호 합니다.
만약 컴포넌트들을 수직 정렬로 배치한다면, 위 레이아웃 중 무엇을 선택해야 할까요?
하나씩 살펴보겠습니다.
FlowLayout
FlowLayout은 가로 방향으로 하나씩 쌓아가면서, 가로 방향 공간이 없을 시, 한칸 내려서 다시 가로 방향으로 쌓습니다.
이 특징을 이용하여 우리는 컴포넌트의 가로 크기를 가로 크기를 창 가로 크기 만큼 잡았을 시, 수직 정렬을 구현 할 수 있습니다.
하지만, 컴포넌트의 가로크기를 창 크기만큼 잡아야 한다는 단점과, 창의 크기를 움직였을때, 가로에 남는 공간이 생긴다면 수직정렬이
깨지기도 합니다. padding 크기를 준다 하더라도, 각 컴포넌트에게 JPanel을 감싸야 하는 불편함이 있죠.
BorderLayout
BorderLayout은 동서남북 가운데 방향에 컴포넌트를 넣을 수 있습니다. 수직 정렬로 쌓으려면 북, 가운데, 남 이렇게 3방향을 써야 하는데요
이렇게 3개의 공간뿐이 쓰질 못하니, 3개의 공간안에 또, JPanel을 배치한 후, 그 JPanel안에 또 컴포넌트를 쌓는 방법밖에 없습니다.
그리고 해보시면 알겠지만, 컴포넌트 사이즈를 원하게 조종하는것도 만만치 않습니다.
GridLayout
GridLayout은 간단하면서도 짜증납니다. 그 이유는 수직정렬 자체는 쉽습니다.
다만, GridLayout 레이아웃 특성상 모든 컴포넌트의 크기가 같습니다.
모든 컴포넌트의 크기가 같아야 하는 경우도 있겠지만, 그런 경우는 흔치 않습니다.
BoxLayout, GridBagLayout
BoxLayout, GirdBagLayout이 우리가 원하는 수직 정렬을 하기 위해 필요한 레이아웃이라 볼 수 있습니다.
단점은 너무 어렵습니다.
BoxLayout은 제 개인적으로 사용해 본 결과 이상하게 오작동하며,
특히 GridBagLayout은 GridBagConstraints라는 제약조건을 설정할 수 있는 객체와 함께 사용하는데, 사용 방법이 무척 어렵습니다.
LinearLayout
간단한 수직정렬 조차 괜찮은 레이아웃이 없던 상황에, 안드로이드 프로그래밍을 할때 썼었던 LinearLayout이 생각났었습니다.
있을땐 몰랐는데 없으니까, 참 쓰기 괜찮은 레이아웃 이였다는 생각이 들었습니다.
결국 직접 만들었습니다. 오픈소스로 제작했구요, 해당 URL 은 아래와 같습니다.
https://github.com/Mommoo/FlatSwing/tree/master/src/com/mommoo/flat/layout/linear
사용방법이 어려운건 선호하지 않기 때문에 최대한 간단한 방향으로 만들었습니다.
아래의 코드는 LinearLayout을 이용한 예시입니다.
예시는 전부 수직정렬만 보여주지만, 수평정렬도 가능합니다.
주석을 읽어보면 어렵지 않게 쓰실 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | JFrame frame = new JFrame(); frame.setSize(500,500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new LinearLayout(Orientation.VERTICAL, 15)); // 기본 컴포넌트 크기입니다. panel.add(new JButton("Test1")); // 설정한 방향과 상반되는 방향의 크기를 부모창 크기 만큼 맞춥니다. panel.add(new JButton("Test2"), new LinearConstraints().setLinearSpace(LinearSpace.MATCH_PARENT)); // 기본 컴포넌트 크기에 가운데 정렬 입니다. panel.add(new JButton("Test3"), new LinearConstraints().setLinearSpace(LinearSpace.WRAP_CENTER_CONTENT)); // 원하는 컴포넌트 크기입니다. JButton button = new JButton("Test4"); button.setPreferredSize(new Dimension(300,200)); panel.add(button); frame.setContentPane(panel); frame.setVisible(true); | cs |
아래의 스샷은 결과물 입니다.
또한 만든 LinearLayout은 멋진 Weight 속성을 줄 수 있습니다.
무게 속성을 이용한다면, 예쁘게 GUI배치를 할 수 있습니다.
아래의 코드를 참고하세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | JFrame frame = new JFrame(); frame.setSize(500,500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new LinearLayout(Orientation.VERTICAL, 15)); // 기본 컴포넌트 크기에 무게 4만큼 차지 합니다. panel.add(new JButton("Test1"), new LinearConstraints().setWeight(4)); // 설정한 방향과 상반되는 방향의 크기를 부모창 크기 만큼 맞추고, 무게 2만큼 차지 합니다. panel.add(new JButton("Test2"), new LinearConstraints().setWeight(2).setLinearSpace(LinearSpace.MATCH_PARENT)); // 기본 컴포넌트 크기에 가운데 정렬이 진행되며 무게 1만큼 차지 합니다. panel.add(new JButton("Test3"), new LinearConstraints().setWeight(1).setLinearSpace(LinearSpace.WRAP_CENTER_CONTENT)); // 원하는 컴포넌트 크기와, 무게 3만큼 차지합니다. JButton button = new JButton("Test4"); button.setPreferredSize(new Dimension(300,200)); panel.add(button, new LinearConstraints().setWeight(3)); //총 무게는 4 + 2 + 1 + 3 = 10이므로, 각 컴포는트는 10에서 무게 크기 만큼 크기를 나눠 가집니다. frame.setContentPane(panel); frame.setVisible(true); | cs |
아래의 스샷은 결과물 입니다.
오늘 포스팅은 여기까지 입니다.
LinearLayout은 현재 만들고 있는 Swing 라이브러리에 있습니다.
현재 제작중이라... 버그가 있을 수 있습니다.
알려주시면 빠르게 수정 할 수 있으니, 알려주시면 감사하겠습니다.
좀더 많은 정보를 알고 싶으시면 아래의 URL을 참고해주세요.
FlatSwing - https://github.com/Mommoo/FlatSwing (멋진 Flat디자인이 적용된 스윙 라이브러리)
감사합니다.
'Java' 카테고리의 다른 글
[Java] 파일 경로 처리하기. (2) | 2019.01.24 |
---|---|
JAVA - JNI 사용하기 (2) | 2017.09.02 |
JAVA - DownCasting(다운캐스팅) (25) | 2016.08.27 |
JAVA - HashMap key 구하기. (1) | 2016.08.25 |
JAVA - 변수 선언할때 m을 왜 붙일까? (2) | 2016.07.05 |
포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.