Swing의 기초 코드와 요소 반복 예제입니다. Swing 코드 작성 순서는 대략 다음과 같습니다.
- javax.swing.JFrame 클래스를 상속받는 클래스를 생성
- 라벨, 박스, 패널 등 컴포넌트 요소들을 private으로 선언
- 프레임의 초기 설정을 생성자 또는 적당한 위치에서 선언
- 컴포넌트 요소들을 프레임에 배치하는 메소드를 작성
package com.apple.hangeul;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class PrintArray extends JFrame {
static final long serialVersionUID = 0;
// 1. 라벨, 박스, 패널 등을 private으로 선언
private JPanel innerPanel;
private List<?>[] list;
private int maxSize;
// 2. 초기 설정을 생성자 또는 적당한 위치에서 선언
public void init(List<?>... list) {
// 1칸당 80px
System.out.println(list.length);
maxSize = list[0].size();
for(List<?> i : list) {
if(i.size() > maxSize) maxSize = i.size();
}
this.setSize(80 * maxSize, 40 + 80 * list.length);
this.setTitle("Array");
this.setLocationRelativeTo(null); // 정중앙 위치에 배치
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
innerPanel = new JPanel();
innerPanel.setLayout(new GridLayout(list.length, 3));// (열, 행): 열의 수가 중요
innerPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
innerPanel.setBackground(Color.WHITE);
this.add(innerPanel);
this.list = list;
this.initComp();
this.setVisible(true); // setVisible을 이곳에서 실행
}
public PrintArray(int[] intArr) {
// To boxed list (int -> Integer)
List<Integer> tempList = Arrays.stream( intArr ).boxed().collect( Collectors.toList() );
init(tempList);
}
public PrintArray(int[][] intArr) {
List<?>[] tempArr = new List<?>[intArr.length];
System.out.println(intArr.length);
for(int i = 0; i < tempArr.length; i++) {
tempArr[i] = Arrays.stream( intArr[i] ).boxed().collect( Collectors.toList() );
}
init(tempArr);
}
// Character는 위와 같은 stream을 쓰는 방법이 불가능
public PrintArray(char[] charArr) {
List<Character> tempList = new ArrayList<>();
for(char c : charArr) {
tempList.add((Character) c);
}
init(tempList);
}
public PrintArray(char[][] charArr) {
List<?>[] tempArr = new List<?>[charArr.length];
for(int i = 0; i < tempArr.length; i++) {
List<Character> tempList = new ArrayList<>();
for(char c : charArr[i]) {
tempList.add((Character) c);
}
tempArr[i] = tempList;
}
init(tempArr);
}
// 3. 실제 요소들을 배치하는 메소드를 작성
public void initComp() {
for(int i = 0; i < list.length; i++) {
List<?> tempList = (List<?>) list[i];
/* 요소들을 for문으로 배치하기 */
for(int j = 0; j < maxSize; j++) {
JLabel lbl = new JLabel("");
try {
lbl.setOpaque(true); // 이 코드가 있어야 레이블에 색 서식 적용됨
// 0인 경우엔 공백 처리. 아니면 색칠
if(tempList.get(j) instanceof Integer
&& (Integer)tempList.get(j) == 0) {
lbl.setBackground(Color.WHITE);
} else {
lbl.setText("" + tempList.get(j) + "");
lbl.setBackground(Color.ORANGE);
}
// 가운데 정렬
lbl.setHorizontalAlignment(JLabel.CENTER);
lbl.setFont(new Font("Impact", Font.PLAIN, 22));
lbl.setBorder(BorderFactory.createLineBorder(Color.WHITE, 3));
innerPanel.add(lbl);
} catch(Exception e) {
// 이 메소드는 다차원 배열의 각 행의
// 길이가 뒤죽박죽일 때 예외가 나는 점을 이용해
// 예외가 났다면 빈 공간으로 간주하고 빈칸을 그리는 부분
lbl.setOpaque(true);
lbl.setBackground(Color.LIGHT_GRAY);
lbl.setBorder(BorderFactory.createLineBorder(Color.WHITE, 3));
innerPanel.add(lbl);
continue;
}
}
}
}
public static void main(String[] args) {
int[][] example = {{12, 2, 50, 4, 11, 169, 83 ,61, 200},
{300, 542, 396, 8833},
{15234, 59, 1932}};
new PrintArray(example);
}
}

아래는 정보처리기사 실기에서 나오는 배열 예제(모래시계 배열)입니다.






4개의 댓글
예제: 모래시계 모양 배열 만들기 – BGSMM · 2019년 1월 10일 2:34 오후
[…] PrintArray 에 관련된 내용은 여기를 참고 […]
자바 Swing: for문으로 만든 컴포넌트에 접근 + 예제: 틱택토(Tic Tac Toe) – BGSMM · 2019년 1월 28일 2:18 오후
[…] 예전에 썼던 글에서 for문으로 생성한 컴포넌트는 접근이 어렵다고 했었는데 (링크) […]
Java 예제: 로또 (중복없이 배열에서 값 추출, 배열 원소 스왑) - BGSMM · 2019년 9월 18일 9:07 오후
[…] […]
Java 예제: 배열 회전 - BGSMM · 2019년 9월 18일 10:09 오후
[…] […]