이번 시간에는 앞선 시간에 이어서 자바 GUI를 배우겠습니다.
1. Swing의 컨테이너 (JFrame)
더블클릭을 하시면 이미지를 수정할 수 있습니다
- import로 java.awt.* 사용합니다.
- 구현된 인터페이스
- ImageObserver
- MenuContainer
- Serializable
- Accessible
- RootPaneContainer
- WindowConstants
- 생성자
- JFrame() : 타이틀이 없는 프레임을 생성
- JFrame(String title) : 타이틀이 있는 프레임 생성
- 구성
- JRootPane : 실직적인 윈도우 기능을 수행하는 경량의 컨테이너
- glassPane과 layerPane으로 구성
- layerPanem은 JMenuBar와 contenPane을 포함
- layerPane : 루트 페인에 대해 레이어를 할 수 있도록 여러 층의 패널을 포함 할 수 있는 패널로 윗 부분은 menuBar와 아래 부분은 contentPane으로 구성
- glassPane : 기본적으로 숨겨진 상태로 되어 있으며 다른 패널 위에 존재하는 패널
- 마우스 이벤트를 처리하기 위해 가장 먼저 루트 페인에 추가된다.
- contentPane : 일반적인 컴포넌트들을 가질 수 있는 패널
- 프레임 객체의 getContentPane()메소드를 이용해서 얻을 수 있다.
- menuBar : 윈도우의 메뉴를 제공하는 역할로 생략이 가능한 선택항목
- JMenu, JmenuItem 등을 이용해서 메뉴를 구성하여 setJMenuBar()메소드를 이용해서 등록 할 수 있다.
- 메소드
MenuBar getMenuBar() | 프레임의 메뉴바를 리턴 |
int getState() | 프레임의 상태를 리턴 |
String getTitle() | 타이틀 바의 문자열을 리턴 |
void remove(MenuComponent m) | 프레임에서 지정한 메뉴를 제거 |
void setResizable(Boolean resizeable) | 프레임의 크기를 사용자가 변할 수 있게 지정 |
void setsize(int width, int height) | 사이즈를 'width' 및 'height'로변경 |
pack() | 컨테이너의 크기를 구성 요소 들의 크기로 설정 |
void setVisible(boolean b) | 'b'에 의해 컴퍼넌트 표시 or 비표시 설정 |
void setLocation(int x, int y) | 이 컴퍼넌트를 새로운 위치로 이동 |
setBounds(int x, int y, int width, int height) | 위치, 너비, 높이 지정 |
getContentPane() | 프레임의 contentPane 오브젝트를 돌려줍니다. |
setIconImage(Image image) | 프레임의 최소화된 아이콘에 표시되는 이미지를 설정 |
add(컴포넌트) | 컴포넌트를 부착 |
- 기본적으로 타이틀, 최소버튼, 최대버튼, 종료버튼이 지원
- 기본적으로 화면에 안보이게 설정했기 때문에 반드시 setVisible(true)값으로 설정해야 화면상에 보여짐
- 만드는 방법은 JFrame 객체를 직접생성 or JFrame으로부터 상속 받는다.
- 종료 이벤트 처리는 setDefaultCloseOperation(EXIT_ON_CLOSE)을 호출한다.
<JFrame 상속 예제 소스코드 - JFrameTest.class>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import javax.swing.JFrame; public class JFrameTest extends JFrame { // JFrmae 타이틀 없는 생성자 public JFrameTest() { super("J프레임 테스트"); // 크기 지정 setSize(350,100); // 창을 보이게함 setVisible(true); } public static void main(String[] args) { JFrameTest f = new JFrameTest(); // 종료 이벤트 f.setDefaultCloseOperation(EXIT_ON_CLOSE); } } | cs |
<결과>
- JPanel
- 컴포넌트들을 그룹 별로 묶어서 처리할 때 사용하는 컨테이너
- 일반적으로 Frame에 컴포넌트들을 직접 붙이지 않고 Panel 이용
- 생성자
JPanel() | 디폴트의 레이아웃 사용해 새로운 Panel 생성 |
JPanel(LayoutManager layout) | 지정된 레이아웃 매니저를 이용하여 새로운 Panel 생성 |
JPanel(boolean isDoubleBuffered) | 지정된 버퍼를 이용해 새로운 Panel 생성 |
- JScrollPane
- 스크롤을 이용해서 컴포넌트들을 보여주는 컴포넌트
- 스크롤을 이용해서 보여주는 화면을 상하좌우로 이동하여 포함된 컴포넌트의 원래크기 유지
- JList, JTextArea, JTextPane 등이용
2. Swing의 컴포넌트
- 윈도우를 구성하는 작은 부품
- 컨테이너의 add를 통해 부착
- Border : 경계선
- AbstractBorder : 최상위 추상 클래스
- Border 객체를 생성한 후 컴포넌트의 setBorder()를 이용해서 설정
- setTooltipText(일반 텍스트 또는 html코드)를 이용해서 툴 팁 작성 가능
- JLabel
- 컴포넌트에 텍스트와 이미지를 모두 넣을 수 있습니다.
- getText와 setText(String str)을 이용해서 텍스트 설정
- AbstractButton
- JButton, JToggleButton, JRadioButton 등의 모든 버튼의 종류를 추상화한 클래스
- 버튼에 텍스트와 이미즈를 모두 넣을 수 있고 다양한 샅애에서 보여줄 버튼의 이미지를 각각 지정 하여 Roll-Over 버튼을 만들 수도 있습니다.
- JButton(Icon icon), JButton(String text, Icon icon)
- JToggleButton
- 버튼의 상태를 기본과 선택된 상태 두가지를 가지는 버튼으로 선택된 상태를 계속유지
- 기본상태와 선택된 상태를 구분하기위해 서로다른 아이콘 지정 사용가능
- JRadioButton
- AWT의 Checkbox 클래스를 이용한 라디오 형 체크박스와 유사한 형태의 컴포넌트
- 여러 항목 중에서 하나의 항목만 선택할 수 있도록 만든 컴포넌트
<JButton 예제 소스코드 - JButtonTest.class>
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JToggleButton; public class JButtonTest extends JFrame { public JButtonTest() { super("버튼 테스트"); // 버튼을 넣기위한 패널 생성 JPanel buttonPanel = new JPanel(); // 'Button'이름을 가진 버튼 생성 JButton btn = new JButton("Button"); // 버튼 넣기 buttonPanel.add(btn); // 버튼안에 이미지 넣기 ImageIcon icon1 = new ImageIcon(".\\src\\red.png"); ImageIcon icon2 = new ImageIcon(".\\src\\black.png"); JToggleButton tgbutton = new JToggleButton(icon1); buttonPanel.add(tgbutton); // '취미'레이블 JLabel lblHobby = new JLabel("취미"); // 체크박스 JCheckBox check1 = new JCheckBox("운동"); JCheckBox check2 = new JCheckBox("독서"); JCheckBox check3 = new JCheckBox("영화감상"); buttonPanel.add(lblHobby); buttonPanel.add(check1); buttonPanel.add(check2); buttonPanel.add(check3); // '성별'레이블 JLabel lblMale = new JLabel("성별"); // JRadioButton rb1 = new JRadioButton("남자"); JRadioButton rb2 = new JRadioButton("여자"); ButtonGroup bg = new ButtonGroup(); bg.add(rb1); bg.add(rb2); buttonPanel.add(lblMale); buttonPanel.add(rb1); buttonPanel.add(rb2); add(buttonPanel); setLocation(150,200); setSize(242,150); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { new JButtonTest(); } } | cs |
- JTextField
- 생성자
- void setBackground(Color c) : 백그라운드 칼라를 설정
- void setCaretPosition(int pos) : caret의 위치를 설정
- void setText(String t) : 표시되는 텍스트를 지정된 텍스트로 설정
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | import javax.swing.*; import java.awt.*; import javax.swing.border.*; public class JTextTest extends JFrame { JLabel lbl,la1,la2,la3; JTextField id; JPasswordField passwd; JPanel idPanel,paPanel,loginPanel; JButton b1,b2; JTextArea content; public JTextTest() { super( "JText테스트" ); // FlowLayout사용 setLayout( new FlowLayout() ); // Border로 영역 생성 EtchedBorder eborder = new EtchedBorder(); // 레이블 생성 lbl = new JLabel( "아이디와 패스워드를 입력해 주세요" ); // 레이블에 영역 만들기 lbl.setBorder(eborder); // 레이블 추가 add( lbl ); // id패널과 pw 패널생성 idPanel = new JPanel(); paPanel = new JPanel(); la3 = new JLabel("아이디"); la2 = new JLabel("패스워드"); // id텍스트필드와 pw텍스트 필드 선언 id = new JTextField(10); passwd = new JPasswordField(10); idPanel.add(la3); idPanel.add(id); paPanel.add( la2 ); paPanel.add( passwd ); // 로그인과 회원가입을 위한 패널 생성 loginPanel = new JPanel(); b1 = new JButton("로그인"); b2 = new JButton("회원가입"); loginPanel.add( b1 ); loginPanel.add( b2 ); add(idPanel); add(paPanel); add(loginPanel); // 3행 20열 영역의 텍스트에어리어 content = new JTextArea(3,20); JScrollPane s= new JScrollPane(content); add(s); setSize( 250, 350 ); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main( String args[] ) { new JTextTest(); } } | cs |
- JComboBox
<생성자>
JComboBox(ComboBoxModel m) | 지정한 콤보박스 모델을 사용하는 콤보박스 객체 생성 |
JComboBox(Object[] items) | 지정한 배열의 자료를 보여주는 콤보박스 객체 생성 |
JComboBox(Vector items) | 지정한 백테의 자료를 보여주는 콤보박스 객체 생성 |
<메소드>
void addActionListener(Action a) | 콤보박스에서 아이템을 선택했을 때 발생하는 이벤트를 받기위해 지정된 리스너 추가 |
void addItemListener(ItemListener a) | 콤보박스에서 아이템의 선택이 바꿨을 때 발생하는 이벤트를 받기 위해 지정된 리스터 추가 |
void showPopup() | 팝업 윈도우를 보이게 한다. |
Object getItemAt(int index) | 지정한 인덱스의 아이템을 얻어온다. |
void addItem(Object o) | 지정한 아이템을 목록에 추가한다. |
void insertItemAt(Object o, int index) | 지정한 아이템을 지정한 인덱스 위치에 추가 |
void removeAllItems() | 모든 아이템을 제거한다. |
void removeItem(Object o) | 지정된 아이템을 목록에서 제거한다. |
void removeItemAt(int index) | 지정된 인덱스의 아이템을 목록에서 제거한다. |
void setEditable(Boolean flag) | 콤보박스의 편집 가능 상태를 지정한다. |
- JList
<생성자>
JList(ListModel m) | 지정한 리스트 모델을 사용하는 리스트 객체 생성 |
JList(Object[] listData) | 지정한 배열의 자료를 보여주는 리스트 객체 생성 |
JList(Vector listData) | 지정한 벡터의 자료를 보여주는 리스트 객체 생성 |
<메소드>
void addListSelectionListener (ListSelection listener) | 리스트에서 선택하는 항목이 바뀌었을 때 발생하는 이벤트를 받기 리스너 추가 |
void ensureIndexisVisible(int index) | 지정한 인덱스의 아이템이 보여지도록 리스트 스크롤 시킨다. |
void setSelectionBackground (Color selectionBackground) | 선택된 아이템의 배경색을 지정한다. |
void setSelectionForeground (Color selectionForeground) | 선택된 아이템의 전경색을 지정한다. |
void setSelectionModel (ListSelectionModel selectionModel) | 지정된 ListenerModel로 지정한다. |
boolean isSelectionEmpty() | 선택된 아이템이 있는지 검사하여 있으면true, 없으면 false |
int getSelectedIndex() | 선택된 첫 번째 아이템으 인덱스를 얻어온다. |
int[] getSelectedIndices() | 선택된 모든 아이템의 인덱스를 배열로 얻어온다. |
Object getSelectedValue() | 선택된 아이템을 얻어온다. |
Obgect[] getSelectedValues() | 선택된 모든 아이템을 배열로 얻어온다. |
void setSelectedIndex(int index) | 지정된 인덱스의 아이템을 선택된 상태로 만든다. |
void setSelectedValue(Object o, boolean shouldScroll) | 지정된객체를 가진 아이템을 선택된 상태로 만들고 shouldScroll이 true면 그 아이템이 보이도록 스크롤 한다. |
void setModel(ListModel m) | 지정된 모델로 리스트의 모델을 지정한다. |
void setListData(Object[] listData) | 지정된 배열 자료를 사용하는 모델을 만들고 지정한다. |
void setListData(Vector listData) | 지정된 백터 자료를 사용하는 모댈을 만들고 지정한다. |
<ComboBox 예제 소스코드 - ComboTest.class>
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; public class ComboList extends JFrame { JPanel p, p1, p2; // JList 선언 JList<String> jl; // ComboBox 선언 JComboBox<String> com; String name[] = { "너구리", "돼지", "족제비 ", "봉이", "말" }; String count[] = { "1", "2", "3", "4", "5" }; public ComboList() { super("JComponent연습"); Container c = getContentPane(); // FlowLayout 생성 c.setLayout(new FlowLayout()); // JPanel 생성 p = new JPanel(new GridLayout(1, 2)); // JComboBox에 name 배열 널기 com = new JComboBox<String>(name); JScrollPane s = new JScrollPane(com); c.add(s); // JList에 count배 jl = new JList<String>(count); JScrollPane s1 = new JScrollPane(jl); jl.setVisibleRowCount(4); c.add(s1); setSize(250, 300); setVisible(true); } public static void main(String args[]) { ComboList Obj = new ComboList(); Obj.setDefaultCloseOperation(EXIT_ON_CLOSE); } } | cs |
<결과>
- BoxLayout
- Swing에 추가된 Layout
- Box : 컴포넌트들을 왼쪽에서 오른쪽으로 수평배치되거나 위에서 아래로 수직배치 해 주는 객체
- 생성
- Box.createVerticalBox() : 수평으로 컴포넌트 추가
- Box.createHorizontalBox() : 수직으로 컴포넌트 추가
- Box.createVerticalStrut(int width)
- Box.createHorizontalStrut(int width)
<BoxLayout 예제 소스코드 - BoxLayoutTest.class>
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import javax.swing.*; import java.awt.*; import javax.swing.border.*; public class BoxLayoutTest extends JFrame { public BoxLayoutTest(){ super( "BoxLayout Test" ); JRadioButton r1,r2; //박스 레이아웃 매니저를 생성하고 컨테이너에 설정 setLayout(new BorderLayout()); //수직 배치 박스 레이아웃을 생성 Box left = Box.createVerticalBox(); //보기 좋게 배치하기 위래 투명 컴포넌트로 공간 확보 left.add(Box.createVerticalStrut(30)); //라디오버튼을 위한 버튼 그룹 생성 ButtonGroup radioGroup = new ButtonGroup(); //버튼 객체를 생성 후 버튼 그룹에 추가 radioGroup.add(r1 = new JRadioButton("치킨")); //버튼 객체를 Box객체 left에 추가 left.add(r1); left.add(Box.createVerticalStrut(30)); radioGroup.add(r2 = new JRadioButton("피자")); left.add(r2); //Box객체 left를 패널에 추가 JPanel leftPanel = new JPanel(new BorderLayout()); //패널의 테두리선을 에칭효과로 지정 leftPanel.setBorder( new TitledBorder( new EtchedBorder(),"음식")); leftPanel.add(left, BorderLayout.CENTER); //수직으로 배치하는 박스레이아웃 생성 Box right = Box.createVerticalBox(); right.add(Box.createVerticalStrut(30)); //체크박스를 생성해 박스레이아웃에 추가 right.add(new JCheckBox("너구리")); right.add(Box.createVerticalStrut(30)); right.add(new JCheckBox("돼지")); right.add(Box.createVerticalStrut(30)); right.add(new JCheckBox("족제비")); right.add(Box.createVerticalStrut(30)); right.add(new JCheckBox("봉이")); JPanel rightPanel = new JPanel(new BorderLayout()); rightPanel.setBorder( new TitledBorder(new EtchedBorder(), "동물")); rightPanel.add(right, BorderLayout.CENTER); //수평으로 배치하는 박스레이아웃을 생성해 //패널leftPanel과 rightPanel을 이 박스 레이아웃에 배치 Box center = Box.createHorizontalBox(); center.add(leftPanel); center.add(rightPanel); add(center, BorderLayout.CENTER); setSize(300,300); setVisible(true); } public static void main(String[] args) { BoxLayoutTest box = new BoxLayoutTest(); box.setDefaultCloseOperation(EXIT_ON_CLOSE); } } | cs |
<결과>
- JTable
- 데이터를 행과 열로 구성되어 있는 테이블 형식으로 보여주는 컴포넌트
- JTable 역시 Scrollable 인터페이스가 구현되있음
- JTable을 사용하기 위해서는 먼저 데이터를 저장할 모델을 만들고 View인 JTable에 연결
<생성자>
JTable() | 기본 자료 모델, 기본 컬럼 모델, 기본 선택 모델로 초기화된 테이블 객체 생성 |
JTable(int rows, int cols) | DefaultTableModel을 이용해 빈 셀을 행과 열의 수만큼 테이블 객체 생성 |
JTable(Object[] rowData, Object colsName) | 2차원 배열에 값들을 보여주는 테이블 객체를 생성, 주어진 테이블 데이터와 컬럼의 이름을 가진다. |
JTable(TableModel dm) | 주어진 dm을 가지는 자료 모델, 기본 컬럼 모델, 기본 선택 모델로 초기화된 테이블 객체를 생성 |
JTable(TableModel dm, TableColumnModel cm) | 주어진 dm을 가지는 자료 모델, cm을 가지는 컬럼 모델, 기본 선택 모델로 초기화된 테이블 객체를 생성 |
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) | 주어진 dm을 가지는 자료모델, cm 을가지는 컬럼 모델, sm을 가지는 선택 모델로 초기화된 테이블 객체 생성 |
JTable(Vector rowData, Vector colsName) | 주어진 벡터의 값들을 보여주는 테이블 객체 생성, 주어진 테이블 자료와 컬럼 이름을 가짐 |
<메소드>
void setModel(TableModel dataModel) | 주어진 자료 모델을 테이블 자료 모델로 지정 |
void setColumnModel (TableColumnModel columnModel) | 주어진 컬럼 모델울 테이블의 컬럼 모델로 지정 |
setCellEditor(TableCellEditor anEditor) | 주어진 셀 자료를 테이블의 셀 에디터로 지정 |
void setValueAt(Object aValue, int row, int cols) | 테이블 모델의 셀에 주어진 행과 열의 위치에 자료를 설정한다. |
Object getValueAt(int row, int cols) | 주어진 행과 열 위치에 있는 셀값을 얻어옴 |
void setAutoResizeMode(int mode) | 컬럼의 자동 크기 조절 모드를 설정 |
void setIntercellSpacing (Dimension intercellSpacing) | 셀 사이의 간격을 설정한다. |
void setSelectionBackground (Color selectionBackground) | 선택된 셀의 배경색을 설정한다. |
void setSelectionForeground (Color selectionForeground) | 선택된 셀의 전경색을 설정한다. |
void setShowHorizontalLines (boolean showHorizontalLines) | 셀 사이의 수평 구분선을 그릴지 설정 |
void setShowVerticalLines (boolean showVerticalLines) | 셀 사이의 수직 구분선을 그릴지 설정 |
void clearSelection() | 선택된 행과 열 셀을 지움 |
void selectAll() | 전체 테이블의 셀, 행과 열을 선택 |
void setCellselectionEnabled (boolean cellSelectionEnabled) | 행과 열을 동시에 선택할 수 있도록 하는 선택모드를 사용할지를 설정한다. |
void setColumnSelectionAllowed (boolean columnSelectionAllowed) | 테이블의 열을 동시에 선택할 수 있도록 하는 선택모드를 사용할지 설정 |
void setRowSelectionAllowed (boolean rowSelectionAllowed) | 테이블의 행을 동시에 선택할 수 있도록 하는선택모드를 사용할지 설정 |
int getSelectedColumn() | 선택된 열의 첫번째 위치를 얻어온다. 선택된 열이 없으면 -1을 얻음 |
int[] getSelectedColums() | 선택된 열들을 배열 형태로 얻음 |
int getSelectedRow() | 선택된행의 첫번째 위치를 얻어온다. 선택된 행이 없으면 -1 |
int[] getSelectedRows() | 선택된 행들을 배열 형태로 얻어온다. |
boolean isCellSelected(int row, int column) | 주어진 위치의 셀이 선택 상태인지를 얻음 |
int getColumnCount() | 열 수를 얻음 |
int getRowCount() | 행 수를 얻음 |
Object getValueAt(int rowIndex, int colsIndex) | 주어진 위치의 셀값을 얻음 |
void setValueAt(Object aValue, int rowIndex, int colsIndex) | 주어진 위치의 셀값을 설정 |
<JTable 예제 소스코드 - JTableTest.class>
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 26 27 28 29 30 31 32 | import java.awt.*; import javax.swing.*; public class JTableTest extends JFrame { public JTableTest() { super("JTable 테스트"); String title[] = {"번호", "이름", "나이"}; String data[][] = { {"1", "너구리", "26"}, {"2", "돼 지", "25"}, {"3", "족제비", "24"} }; // JTable 행에는 데이터 열에는 타이틀 지정 JTable table = new JTable(data, title); // JTable 스크롤 JScrollPane sp = new JScrollPane(table); // 테이블 위치 getContentPane().add(sp, BorderLayout.CENTER); setSize(300, 150); setVisible(true); } public static void main(String args[]) { JTableTest jtable = new JTableTest(); jtable.setDefaultCloseOperation(EXIT_ON_CLOSE); } } | cs |
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import java.awt.*; public class DataModelTest { public static void main(String args[]) { // 데이터 값 String rows[][] = { { "너구리", "치킨" }, { "돼 지", "피자" }, { "족제비", "족발" } }; // 항목 값 String headers[] = { "이름", "음식" }; // 선택 할 수 있는 값(콤보 박스에 넣을 값) String sports[] = {"치킨", "피자", "족발","기타"}; // 콤보박스 생성 JComboBox<String> comboBox = new JComboBox<String>(sports); // 콤보박스 항목 최대 4개 comboBox.setMaximumRowCount(4); // 테이블에 생성 TableCellEditor editor = new DefaultCellEditor(comboBox); // JFrame을 상속받지 않고 코드상으로 사용하는 방법 JFrame frame = new JFrame("JTable Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 테이블 생성 JTable table = new JTable(new DefaultTableModel(rows, headers)); // 테이블에 콤보박스 가능 table.getColumnModel().getColumn(1).setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(table); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); } } | cs |
- GUI 이벤트 처리는 3부에 설명하겠습니다~
'AWT (GUI)' 카테고리의 다른 글
GUI 이벤트 처리(3) (0) | 2018.07.01 |
---|---|
GUI 이벤트 처리(1) (0) | 2018.07.01 |