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 오후
[…] […]