Swing 컴포넌트, 컨테이너 레이아웃 매니저 그리고 이벤트를 기반으로 하는 시스템 독립적인 GUI 프로그래밍을 위한 API
1. Swing의 컨테이너(JFrame) java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame 구현된 인터페이스: ImageObserver, MenuContainer, Serializable, Accessible, RootPaneContainer, WindowConstants 생성자 JFrame (): 타이틀이 없는 프레임을 생성 JFrame (String title): 타이틀이 있는 프레임을 생성
1. Swing의 컨테이너(JFrame) JFrame의 구성 JRootPane: 실질적인 윈도우 기능을 수행하는 경량의 컨테이너로 JFrame의 getRootPane() 메소드로부터 얻어낼 수 있습니다. JRootPane은 glassPane과 layeredPane으로 구성되어 있고 layeredPane은 JMenuBar와 contentPane을 포함 layeredPane: 여러 층의 패널을 포함 할 수 있는 패널로 윗 부분은 menuBar와 아래 부분은 contentPane으로 구성 glassPane: 기본적으로 숨겨진 상태로 되어 있으며 다른 패널 위에 존재하는 패널 마우스 이벤트를 처리하기 위해 가장 먼저 루트 페인에 추가됩니다. contentPane: 일반적인 컴포넌트들을 가질 수 있는 패널 프레임 객체의 JRootPane으로 부터 getContentPane()메소드를 이용해서 얻을 수 있습니다. menuBar: 윈도우의 메뉴를 제공하는 역할로 생략이 가능한 선택항목 JMenu, JmenuItem 등을 이용해서 메뉴를 구성하여 setJMenuBar()메소드를 이용해서 등록할 수 있습니다.
1. Swing의 컨테이너(JFrame) 메소드 MenuBar getMenuBar(): 프레임의 메뉴바를 리턴 int getState(): 프레임의 상태를 리턴 String getTitle(): 타이틀 바의 문자열을 리턴 void remove(MenuComponent m): 프레임에서 지정한 메뉴를 제거 void setMenuBar(MenuBar mb): 프레임의 메뉴바를 지정 void setResizable(Boolean resizeable): 프레임의 크기를 사용자가 변경할 수 있게 할 것인지를 지정 void setSize (int width, int height): 사이즈를 width 및 height 로 변경 pack(): 컨테이너의 크기를 구성 요소들의 크기로 설정 void setVisible (boolean b): 파라미터 b 값에 의해 이 컴퍼넌트를 표시하는지 또는 비 표시로 설정 void setLocation (int x, int y) 이 컴퍼넌트를 새로운 위치로 이동 setBounds (int x, int y, int width, int height) getContentPane(): 프레임의 contentPane 오브젝트를 돌려줍니다. setIconImage (Image image): 프레임의 최소화된 아이콘에 표시되는 이미지를 설정 add(컴포넌트): 컴포넌트를 부착
1. Swing의 컨테이너(JFrame) 기본적으로 타이틀, 최소버튼, 최대버튼, 종료버튼이 지원됩니다. 기본으로 화면에 안 보이도록 설정되어 있기 때문에 반드시 setVisible(true)값으로 설정해야 화면상에 보여지게 됩니다. 만드는 방법은 JFrame 객체를 직접 생성할 수 있고 JFrame으로부터 상속받은 클래스를 작성 한 후 객체를 생성 할 수 있음 종료 이벤트 처리는 setDefaultCloseOperation(EXIT_ON_CLOSE)을 호출해서 처리 화면 크기 구하기 Tookit t = Tookit.getDefaultTookit(); Dimension screenSize = t.getScreenSize();
실습(JFrameTest.java) import javax.swing.*; public class JFrameTest extends JFrame { public JFrameTest() super("J프레임연습"); setSize(260,100); setVisible(true); }
실습(SwingMain.java) import javax.swing.*; public class SwingMain { public static void main(String[] args) { JFrameTest f = new JFrameTest(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
1. Swing의 컨테이너(JPanel) 컴포넌트들을 그룹 별로 묶어서 처리할 때 사용하는 컨테이너 일반적으로 JFrame에 컴포넌트들을 직접 붙이지 않고 JPanel에 그룹별로 붙이고 다시 Panel을 Frame에 붙이는 경우가 많습니다. 생성자 JPanel(): 디폴트 레이아웃 매니저를 사용해 새로운 Panel을 생성 JPanel(LayoutManager layout): 지정된 레이아웃 매니저를 이용하여 새로운 Panel을 생성 JPanel(boolean isDoubleBuffered)
1. Swing의 컨테이너(JScrollPane) 스크롤을 이용해서 컴포넌트들을 보여주는 컴포넌트입니다. 스크롤을 이용해서 포함된 컴포넌트의 원래 크기를 유지한 상태에서 화면을 스크롤 할 수 있도록 해주는 컴포넌트 스크롤이 필요한 컴포넌트(JList, JTextArea, JTextPane 등)는 Scrollable 인터페이스가 구현된 컴포넌트이기 때문에 스크롤 패인에 포함시켜서 출력해야 하는데 그렇게 하지 않으면 처음 설정한 크기 만큼만 출력되고 설정된 크기를 넘어가면 출력을 하지 않습니다. 포함된 컴포넌트의 크기가 뷰 영역보다 큰 경우 자동으로 스크롤 바가 생성이 되어 보여지게 됩니다. 스크롤 패인에는 1개의 컴포넌트만 배치가 가능합니다.
1. Swing의 컨테이너(JScrollPane)
2. Swing의 컴포넌트 윈도우를 구성하는 작은 부품 컨테이너의 add(컨테이너 또는 컴포넌트 객체)를 통해 부착 메소드 Color getBackground(): 컴퍼넌트의 배경 색상을 리턴 Color getForeground(): 컴퍼넌트의 전경색을 리턴 int getHeight(): 컴퍼넌트의 높이를 리턴 Point getLocation(): 컴퍼넌트의 위치를 리턴 Point getLocationOnScreen(): 화면의 좌표 공간에서의 위치를 리턴 String getName(): 컴퍼넌트의 이름을 리턴 Container getParent(): 컴퍼넌트의 부모를 리턴 Dimension getSize(): 컴퍼넌트의 사이즈를 오브젝트로 리턴 int getWidth(): 컴퍼넌트의 현재의 폭을 리턴 int getX (), getY () void setBackground (Color c): 컴퍼넌트의 배경색을 설정합니다. void setBounds (int x, int y, int width, int height): 컴퍼넌트를 이동해 사이즈 변경 void setEnabled (boolean b): b 값에 의해 이 컴퍼넌트를 사용 가능 또는 사용 불가능. void setFocusable (boolean focusable): 컴퍼넌트의 포커스 상태 설정 void setForeground (Color c): 전경색 설정 void setLocation (int x, int y), setLocation (Point p) void setMaximumSize (Dimension maximumSize): 최대 사이즈 설정 void setMinimumSize (Dimension minimumSize): 최소 사이즈 설정 void setName (String name): 이름 설정 void setSize (Dimension d), setSize (int width, int height) void setVisible (boolean b): 표시 여부 설정
2. Swing의 컴포넌트 마우스 올려 놓으면 글자 보여주는 것 보더 경계선으로 AbstractBorder가 최상위 클래스 AbstractBorder의 하위 클래스: BevelBorder, CompoundBorder, EmptyBorder, EtchedBorder, LineBorder, MatteBorder, SoftBevelBorder, TitledBorder(문자열을 설정할 수 있는 보더) 보더 객체를 생성한 후 컴포넌트의 setBorder()를 이용해서 설정 setTooltipText(일반 텍스트 또는 html코드)를 이용해서 툴 팁 작성 가능 마우스 올려 놓으면 글자 보여주는 것
2. Swing의 컴포넌트(JLabel) JLabel: 컴포넌트에 텍스트와 이미지를 모두 넣을 수 있습니다. getText와 setText(String str)을 이용해서 텍스트 설정
2. Swing의 컴포넌트(AbstractButton) JButton, JToggleButton, JRadioButton 등의 모든 버튼의 종류를 추상화한 클래스로 버튼 클래스들은 이 클래스로부터 상속을 받습니다. 버튼들의 모양이나 기능은 다르지만 기본적인 기능들은 이 클래스 구현되어 있습니다.
2. Swing의 컴포넌트(JButton) 버튼에 텍스트와 이미지를 모두 넣을 수 있고 다양한 상태에서 보여줄 버튼의 이미지를 각각 지정하여 Roll-Over 버튼을 만들 수도 있습니다.
2. Swing의 컴포넌트(JToggleButton) 버튼의 상태로 기본과 선택된 상태 두 가지를 가지는 버튼 기본 상태에서 한 번 클릭하면 선택상태로 유지하고 있다가 다시 선택하면 기본 상태로 변경되는 버튼입니다. 일반적으로 기본 상태와 선택된 상태를 구분하기 위해서 서로 다른 아이콘을 지정하여 사용을 합니다.
2. Swing의 컴포넌트(JRadioButton) AWT의 Checkbox 클래스를 이용한 라디오 형 체크박스와 유사한 형태의 컴포넌트 여러 항목 중에서 하나의 항목만 선택할 수 있도록 만든 컴포넌트로 여러 개의 항목을 그룹으로 묶어주기 위하여 ButtonGroup 클래스를 이용해서 그룹으로 묶어줍니다.
2. Swing의 컴포넌트(JCheckBox)
실습(JButtonTest.java) import javax.swing.*; public class JButtonTest extends JFrame { public JButtonTest() super("버튼 테스트"); JPanel buttonPanel = new JPanel(); JButton btn = new JButton("Button"); buttonPanel.add(btn); 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);
실습(JButtonTest.java) 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); setLocation(150,200); setSize(242,150); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); }
실습(SwingMain.java) public class SwingMain { public static void main(String[] args) { new JButtonTest(); }
2. Swing의 컴포넌트(JTextField) 반짝 반짝이는 포인터 생성자 JTextField() JTextField (int columns): 지정된 열의 수를 갖는 텍스트 필드 생성 JTextField (String text): 지정된 텍스트로 초기화 한 텍스트 필드 JTextField (String text, int columns) 메소드 int getCaretPosition(): 텍스트 내에서 현재 마우스 포인터의 위치를 리턴 String getText(): 텍스트 내의 표시되는 텍스트를 리턴 void select(int selectionStart, int selectionEnd): 시작위치부터 마지막 위치까지 선택 void selectAll (): 텍스트 컴퍼넌트 내의 모든 텍스트를 선택 void setBackground (Color c): 백그라운드 칼라를 설정 void setCaretPosition (int position): caret의 위치를 설정 void setText (String t): 표시되는 텍스트를 지정된 텍스트로 설정 선택한 글자에 해당하는 글자를 ->위의 글자를 뽑아내서 전달하는 게 중요 사전에서 찾아보는 어플 프로그래밍에서 커서란, 데이터가 있을 때 이 데이터에 순서대로 접근할 수 있는 것
2. Swing의 컴포넌트(JPasswordField) 글자를 쪼갤 필요가 없다 AWT는 쪼갠다. 보여지는 글자
2. Swing의 컴포넌트(JTextArea) 여러 줄을 입력할 수 있는 컴포넌트로 자체적으로 스크롤이 처리되지 않으므로 JscrollPane에 포함시켜 스크롤을 지원합니다. 생성자 JTextArea () JTextArea (int rows, int columns) JTextArea (String text) JTextArea (String text, int rows, int columns) 한 줄의 폭이 텍스트 영역의 폭보다 클 때 자동으로 줄 바꿈을 해주지 않으므로 옵션을 통하여 설정을 해야 합니다. 줄 바꿈을 할 때는 보통 문자 단위로 하지만 setWrapStyleWord() 메소드를 해서 줄 바꿈 옵션을 수정 가능
실습(JTextTest.java) import javax.swing.*; import java.awt.*; import javax.swing.border.*; public class JTextTest extends JFrame { JLabel lbl,la1,la2; JTextField id; JPasswordField passwd; JPanel idPanel,paPanel,loginPanel; JButton b1,b2; public JTextTest() super( "JText테스트" ); setLayout( new FlowLayout() ); EtchedBorder eborder = new EtchedBorder(); lbl = new JLabel( "아이디와 패스워드를 입력해 주세요" ); lbl.setBorder(eborder); add( lbl );
실습(JTextTest.java) idPanel = new JPanel(); la1 = new JLabel("아이디"); id = new JTextField(10); idPanel.add( la1 ); idPanel.add( id ); paPanel = new JPanel(); la2 = new JLabel("패스워드"); passwd = new JPasswordField(10); paPanel.add( la2 ); paPanel.add( passwd );
실습(JTextTest.java) loginPanel = new JPanel(); b1 = new JButton("로그인"); loginPanel.add( b1 ); loginPanel.add( b2 ); add(idPanel); add(paPanel); add(loginPanel); setSize(250, 200); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); }
실습(SwingMain.java) public class SwingMain { public static void main(String[] args) { new JTextTest(); }
2. Swing의 컴포넌트(JComboBox) 생성자 메소드
2. Swing의 컴포넌트(JList) 생성자 메소드
실습(ComboTest.java) import java.awt.*; import javax.swing.*; public class ComboList extends JFrame { JPanel p, p1, p2; JList<String> jl; JComboBox<String> com; String name[] = { "이순신", "김유신", "강감찬 ", "을지문덕", "세종대왕" }; String count[] = { "1", "2", "3", "4", "5" }; public ComboList() { super("JComponent연습"); Container c = getContentPane(); c.setLayout(new FlowLayout()); p = new JPanel(new GridLayout(1, 2));
실습(ComboTest.java) com = new JComboBox<String>(name); JScrollPane s = new JScrollPane(com); c.add(s); jl = new JList<String>(count); JScrollPane s1 = new JScrollPane(jl); jl.setVisibleRowCount(4); c.add(s1); setSize(250, 300); setVisible(true); }
실습(SwingMain.java) import javax.swing.*; public class SwingMain { public static void main(String args[]) { ComboList obj = new ComboList(); obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
2. Swing의 컴포넌트 Swing에 추가된 Layout Box: 컴포넌트들을 왼쪽에서 오른쪽으로 수평 배치되거나 위에서 아래로 수직으 로 배치하도록 해 주는 객체 생성 Box.createVerticalBox(): 수평으로 컴포넌트를 추가할 수 있는 레이아웃 생성 Box.createHorizontalBox(); 수직으로 컴포넌트 추가 Box.createVerticalStrut(int width): 빈 공간 확보 Box.createHorizontalStrut(int width): 빈 공간 확보
실습(BoxLayoutTest.java) import javax.swing.*; import java.awt.*; import javax.swing.border.*; public class BoxLayoutTest extends JFrame { private static final long serialVersionUID = 1L; public BoxLayoutTest(){ super( "BoxLayout연습예제" ); JRadioButton r1,r2; //수직 배치 박스 레이아웃을 생성 Box left = Box.createVerticalBox(); //보기 좋게 배치하기 위래 투명 컴포넌트로 공간 확보 left.add(Box.createVerticalStrut(30)); //라디오버튼을 위한 버튼 그룹 생성 ButtonGroup radioGroup = new ButtonGroup(); //버튼 객체를 생성 후 버튼 그룹에 추가 radioGroup.add(r1 = new JRadioButton("야구")); //버튼 객체를 Box객체 left에 추가 left.add(r1); radioGroup.add(r2 = new JRadioButton("축구")); left.add(r2);
실습(BoxLayoutTest.java) //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("C언어")); right.add(new JCheckBox("Java")); right.add(new JCheckBox("C#")); right.add(new JCheckBox("Phython"));
실습(BoxLayoutTest.java) 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); }
실습(SwingMain.java) import javax.swing.*; public class SwingMain { public static void main(String[] args) { BoxLayoutTest box = new BoxLayoutTest(); box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
3. JTable 데이터를 행과 열로 구성되어 있는 테이블 형식으로 보여주는 컴포넌트 JTable 역시 Scrollable 인터페이스가 구현되어 있어 JScrollPane에 붙여 스크롤을 할 수 있도록 생성할 수 있으며 데이터를 출력하기 위한 모델로는 TableModel 클 래스를 사용 JTable을 사용하기 위해서는 먼저 데이터를 저장할 모델을 만들고 뷰 인 JTable에 연결해서 화면에 출력 생성자
3. JTable 메소드
3. JTable 메소드
3. JTable TableModel: JTable에 출력되는 데이터를 표현하는 것으로 Model에 변화가 생기 면 JTable에 적용이 되서 출력됩니다. 생성자
3. JTable 메소드 addColumn (Object columnName): 모델에 열을 추가합니다. addRow (Object [] rowData) : 모델의 마지막에 행을 추가합니다. getColumnCount (): 데이터 테이블내의 열의 수를 돌려줍니다. getColumnName (int column): 열의 이름을 돌려줍니다. int getRowCount (): 데이터 테이블내의 행의 수를 돌려줍니다. getValueAt (int row, int column): row 및 column 에 위치하는 셀의 속성치 를 돌려줍니다. insertRow (int row, Object [] rowData): 모델의 row 에 행을 추가합니다. moveRow (int start, int end, int to): start 로부터 end 까지의 1 행 또는 복 수행을,to 의 위치로 이동합니다. void setValueAt (Object aValue, int row, int column): column 및 row 에 위 치하는 셀의 객체치를 설정합니다. updateUI(): 다시 출력할 때 사용
실습(JTableTest.java) import java.awt.*; import javax.swing.*; import javax.swing.table.*; public class JTableTest extends JFrame { public JTableTest() super("JTable 테스트"); String title[] = {"번호", "이름", "나이"}; String data[][] = { {"1","김 구 ", "40"}, {"2","이순신", "41"}, {"3","강감찬", "42"} }; //JTable table = new JTable(data, title); DefaultTableModel model = new DefaultTableModel(data, title); JTable table = new JTable(model); JScrollPane sp = new JScrollPane(table); getContentPane().add(sp, BorderLayout.CENTER); setSize(300,150); setVisible(true); }
실습(SwingMain.java) import javax.swing.*; public class SwingMain { public static void main(String args[]){ JTableTest jtable = new JTableTest(); jtable.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
4. Pane 특정 목적에 맞도록 작성된 컴포넌트 JEditorPane 여러 가지 형태의 문서를 보여줄 수 있는 컴포넌트 일반 텍스트나 html, rft 문서를 보여줄 수 있습니다.
4. Pane JTabbedPane 여러 패널을 담을 때 사용하는 컴포넌트 일반적으로 기능별로 분류된 옵션들을 동시에 보여 줄 필요가 없고, 필요 시 하나의 패널만 보여주기 위해서 사용을 하는 컴포넌트 사용방법은 타이틀이나 아이콘을 가지는 탭을 클릭함으로써 여러 개의 패널 중에 선택된 탭으로 교체되면서 화면에 보여주는 컴포넌트 탭의 위치는 상하좌우에 위치할 수 있는데 기본적으로는 패널의 왼쪽 위(Top)에 있습니다
4. Pane
실습(JTabbedPaneTest.java) import java.awt.*; import javax.swing.*; public class JTabbedPaneTest extends JFrame{ JTabbedPane tab; JTable1 j1; JTable2 j2; public JTabbedPaneTest() { super("JTabbedPane 연습예제"); tab = new JTabbedPane(JTabbedPane.TOP); JPanel one = new JPanel(); j1 = new JTable1(); JPanel two = new JPanel(); j2 = new JTable2();
실습(JTabbedPaneTest.java) one.add(j1); two.add(j2); tab.addTab("기본 데이터", one); tab.addTab("기타 데이터", two); getContentPane().add(tab, BorderLayout.CENTER); setSize(500,200); setVisible(true); }
실습(JTabbedPaneTest.java) class JTable1 extends JPanel{ public JTable1(){ String title[] = {"번호", "이름", "나이"}; String data[][] = { {"1","박문석", "40"}, {"2","이종범", "40"}, {"3","강호동", "40"} }; JTable table = new JTable(data, title); JScrollPane sp = new JScrollPane(table); add(sp); } class JTable2 extends JPanel { public JTable2(){ String title[] = {"번호", "직업", "소속"}; {"1","프로그래머", "프리랜서"}, {"2","야구선수", "KIA"}, {"3","MC", "프리랜서"}
실습(SwingMain.java) import javax.swing.*; public class SwingMain { public static void main(String args[]){ JTabbedPaneTest jt= new JTabbedPaneTest(); jt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
4. Pane JOptionPane은 프로그램을 실행하는 도중에 사용자로부터 데이터를 입력 받거나 특정한 메시지를 출력시켜 확인 시키는 작업들을 할 수 있도록 지원하는 컴포넌트입니다. 자체적인 기능을 가지고 있는 것은 아니기 때문에 객체를 생성한 후 반드시 showDialog()메소드를 이용해서 어떤 다이얼로그 박스를 출력시킬 것 인가를 정해야 합니다.
실습(JOptionPaneTest.java) import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JOptionPaneTest extends JFrame implements ActionListener { JButton btn[] = new JButton[4]; String[] str = { "로그인", "회원가입" }; public JOptionPaneTest() { super("JOptionPane 테스트"); setLayout(new FlowLayout()); btn[0] = new JButton("메세지"); btn[1] = new JButton("확인"); btn[2] = new JButton("입력"); btn[3] = new JButton("옵션"); for (JButton n : btn) { add(n); n.addActionListener(this); } pack(); setLocation(300, 300); setVisible(true);
실습(JOptionPaneTest.java) public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == "메세지") { JOptionPane.showMessageDialog(this, "메세지다이얼로그박스", "메세지", JOptionPane.INFORMATION_MESSAGE); } else if (e.getActionCommand() == "확인") { JOptionPane.showConfirmDialog(this, "확인다이얼로그박스", "확인", JOptionPane.YES_NO_OPTION); } else if (e.getActionCommand() == "입력") { JOptionPane.showInputDialog(this, "입력다이얼로그박스", "입력", } else if (e.getActionCommand() == "옵션") { JOptionPane.showOptionDialog(this, "옵션다이얼로그박스", "옵션", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, str, str[1]); }
실습(SwingMain.java) public class SwingMain { public static void main(String[] args) { new JOptionPaneTest(); }
5. FileChooser 프로그램을 실행하는 도중에 데이터를 파일로부터 불러오거나 파일에 저장할 수 있도록 파일 선택 다이얼로그 상자를 사용할 수 있도록 만든 컴포넌트입니다. 파일 선택창은 FileSystemView, FileView, FileFilter 등과 같은 컨트롤러가 조합되어 만들어집니다. FileSystemView는 파일 시스템과 디렉토리 정보를 제공하고, FileView는 디렉토리 내부에 있는 파일들에 대한 정보를 제공하며 FileFilter는 파일을 원하는 종류만 보여줄 수 있도록 걸러주는 역할을 합니다. 멤버 필드 static int CANCEL_OPTION: 취소를 선택했을 때 리턴되는 값 static int APPROVE_OPTION: 예나 확인을 선택했을 때 리턴되는 값 생성자 JFileChooser(): 디폴트 경로 JFileChooser(File currentDirectory): 지정한 경로를 보여줌 JFileChooser(String currentDirectoryPath): 지정한 경로를 보여줌
실습(JFileChooserTest.java) import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.*; import java.io.*; class JFileChooserTest extends JFrame implements ActionListener { JFileChooser fc; public JFileChooserTest() { fc = new JFileChooser(); fc.setMultiSelectionEnabled(true); JButton btn = new JButton("파일 선택"); btn.addActionListener(this); add("North",btn); setBounds(0,0,200,200); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); }
실습(JFileChooserTest.java) public void actionPerformed(ActionEvent e) { FileNameExtensionFilter filter = new FileNameExtensionFilter("텍스트", "txt"); fc.setFileFilter(filter); int result = fc.showOpenDialog(this); if(result == JFileChooser.APPROVE_OPTION) File [] f = fc.getSelectedFiles(); int i=0; for(File n : f) System.out.println(++i + "번째 선택한 파일:" + n.getName()); }
실습(SwingMain.java) public class SwingMain { public static void main(String[] args) { new JFileChooserTest(); }
6. JColorChooser 색상을 선택할 수 있는 다이얼로그 생성자 메소드 JColorChooser(): 초기 색이 흰색 JColorChooser(Color initialColor): 초기 색이 매개 변수 JColorChooser (ColorSelectionModel model): 지정된 선택 판 모델을 가지고 생성 메소드 static JDialog createDialog (Component c, String title, boolean modal, JColorChooser chooserPane, ActionListener okListener, ActionListener cancelListener): [OK],[Cancel], 및 [Reset] 버튼과 함께 지정된 ColorChooser 구획을 가지는 새로운 다이얼로그를 생성 Color getColor(): 색상을 리턴 void setColor(Color color): 색 설정 void setColor(int c): 색 설정 void setColor(int r, int g, int b): 색 설정 static Color showDialog(Component component, String title, Color initialColor) 모달 다이얼로그로 화면에 표시
실습(JColorChooserTest.java) import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; public class JColorChooserTest extends JFrame implements ActionListener { JLabel lbl; JButton btn; public JColorChooserTest() super("JColorChooser 테스트"); btn = new JButton("색상 대화 상자 호출"); lbl = new JLabel("색상 출력"); add("North",lbl); add("Center",btn); btn.addActionListener(this); setBounds(300, 300, 300, 200); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); }
실습(JColorChooserTest.java) public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="색상 대화 상자 호출") JColorChooser color = new JColorChooser(); Color rgb=JColorChooser.showDialog(this,"색상 선택", Color.CYAN); lbl.setText("색상:" + rgb); btn.setBackground(rgb); }
실습(SwingMain.java) public class SwingMain { public static void main(String[] args) { new JColorChooserTest(); }
7. JMenu JMenuBar, JMenu, JMenuItem으로 구성 사용 방법 2단계: setJMenuBar(JMenuBar객체)를 이용해서 컨테이너에 메뉴바 부착 3단계: JMenu객체를 생성해서 JMenuBar 객체의 add(JMenu객체)로 부착 4단계: JMenuItem 객체를 생성해서 JMenu객체의 add (JMenuItem 객체)로 부착 스윙에서는 JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem의 메뉴 아이템이 제공 또한 메뉴 객체에서 setMnemonic(int mnemonic)을 이용해서 단축키도 지정이 가능 ALT와 조합되서 단축키가 됩니다.
실습(JMenuTest.java) import javax.swing.*; public class JMenuTest extends JFrame { private JRadioButtonMenuItem colorItems[], fonts[]; private JCheckBoxMenuItem styleItems[]; private ButtonGroup fontGroup, colorGroup; public JMenuTest() super( "JMenu 테스트" ); JMenuBar bar = new JMenuBar(); setJMenuBar( bar ); JMenu fileMenu = new JMenu( "파일(F)" ); fileMenu.setToolTipText("파일 메뉴입니다"); fileMenu.setMnemonic( 'F' ); JMenuItem newItem = new JMenuItem( "새파일(N)" ); newItem.setMnemonic( 'N' ); fileMenu.add( newItem ); JMenuItem openItem = new JMenuItem( "열기(O)" ); openItem.setMnemonic( 'O' ); fileMenu.add( openItem ); JMenuItem saveItem = new JMenuItem( "저장(S)" ); saveItem.setMnemonic( 'S' ); fileMenu.add( saveItem );
실습(JMenuTest.java) JMenuItem exitItem = new JMenuItem( "닫기(X)" ); exitItem.setMnemonic( 'X' ); fileMenu.add( exitItem ); bar.add( fileMenu ); JMenu formatMenu = new JMenu( "편집(E)" ); formatMenu.setToolTipText("편집 메뉴입니다"); formatMenu.setMnemonic( 'E' ); String colors[] = { "검정", "파랑", "빨강", "초록" }; JMenu colorMenu = new JMenu( "색상(C)" ); colorMenu.setMnemonic( 'C' ); colorItems = new JRadioButtonMenuItem[ colors.length ]; colorGroup = new ButtonGroup(); for ( int i = 0; i < colors.length; i++ ) { colorItems[ i ] = new JRadioButtonMenuItem( colors[ i ] ); colorMenu.add( colorItems[ i ] ); colorGroup.add( colorItems[ i ] ); } colorItems[ 0 ].setSelected( true ); formatMenu.add( colorMenu ); formatMenu.addSeparator();
실습(JMenuTest.java) String fontNames[] = { "굴림", "바탕", "고딕" }; JMenu fontMenu = new JMenu( "글꼴(T)" ); fontMenu.setMnemonic( 'T' ); fonts = new JRadioButtonMenuItem[ fontNames.length ]; fontGroup = new ButtonGroup(); for ( int i = 0; i < fonts.length; i++ ) { fonts[ i ] = new JRadioButtonMenuItem( fontNames[ i ] ); fontMenu.add( fonts[ i ] ); fontGroup.add( fonts[ i ] ); } fonts[ 0 ].setSelected( true ); fontMenu.addSeparator(); String styleNames[] = { "굵게", "기울임" }; styleItems = new JCheckBoxMenuItem[ styleNames.length ];
실습(JMenuTest.java) for ( int i = 0; i < styleNames.length; i++ ) { styleItems[ i ] = new JCheckBoxMenuItem( styleNames[ i ] ); fontMenu.add( styleItems[ i ] ); } formatMenu.add( fontMenu ); bar.add( formatMenu ); JMenu helpMenu = new JMenu( "도움말(H)" ); helpMenu.setToolTipText("도움말 메뉴입니다"); helpMenu.setMnemonic( 'H' ); JMenuItem helpItem = new JMenuItem( "도움말항목(L)" ); helpItem.setMnemonic( 'L' ); helpMenu.add(helpItem); bar.add( helpMenu ); setSize( 400, 200 ); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE);
실습(SwingMain.java) public class SwingMain { public static void main( String args[] ) { new JMenuTest(); }
7. JMenu JPopupMenu클래스를 제공 생성자 JPopupMenu (): 디폴트 생성자 JPopupMenu (String label): label을 타이틀로 갖는 팝업 메뉴 메소드 JMenuItem add(JMenuItem menuItem): menuItem 추가 void show (Component invoker, int x, int y): 컴포넌트 내에서 x, y 좌표로 지정된 위치에 pop-up menu를 표시 마우스 이벤트가 발생해야 하고 이때 MouseEvent 객체의 isPopupTrigger() 메소드를 확인해서 값이 true이면 마우스 오른쪽 버튼을 누른 것이므로 팝업메뉴를 화면에 출력하면 됩니다.
실습(JPopupTest.java) import javax.swing.*; import java.awt.event.*; public class JPopupTest extends JFrame { JMenuItem items[]; public JPopupTest() super( "JPopupMenu연습예제" ); final JPopupMenu popupMenu = new JPopupMenu(); String str[] = { "하나", "둘", "셋", "넷" }; items = new JMenuItem[4]; for ( int i = 0; i < items.length; i++ ) items[i] = new JMenuItem(str[ i ]); popupMenu.add(items[ i ]); }
실습(JPopupTest.java) addMouseListener ( new MouseAdapter() { public void mousePressed( MouseEvent e ) { checkForTriggerEvent( e ); } public void mouseReleased( MouseEvent e ) public void checkForTriggerEvent( MouseEvent e ){ if ( e.isPopupTrigger() ) popupMenu.show( e.getComponent(), e.getX(), e.getY() ); } ); setSize( 300, 200 ); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE);
실습(SwingMain.java) public class SwingMain { public static void main( String args[] ) { new JPopupTest(); }
실습(테이블에 데이터 추가 및 삭제)
실습(DataModelEvent.java) import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class DataModelEvent extends JFrame{ public DataModelEvent() { String rows[][] = { { "윤석민", "야구" }, { "이동국", "축구" }, { "문성민", "배구" } }; String headers[] = { "이름", "종목" }; String sports[] = { "야구", "축구", "배구", "기타" }; setTitle("JTable Test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTable table = new JTable(new DefaultTableModel(rows, headers)); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER);
실습(DataModelEvent.java) JPanel panel = new JPanel(); JTextField text = new JTextField(12); JComboBox<String> comboBox = new JComboBox<String>(sports); comboBox.setMaximumRowCount(4); JButton btn1 = new JButton("삽입"); JButton btn2 = new JButton("삭제"); btn1.addActionListener(new AddActionListener(table, text, comboBox)); btn2.addActionListener(new RemoveActionListener(table)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.add(new JLabel("이름")); panel.add(text); panel.add(new JLabel("종목")); panel.add(comboBox); panel.add(btn1); panel.add(btn2); add("South", panel); setSize(500, 150); setVisible(true); }
실습(AddActionListener.java) class AddActionListener implements ActionListener { JTable table; JTextField text; JComboBox <String>combo; AddActionListener(JTable table, JTextField text, JComboBox<String> combo) this.table = table; this.text = text; this.combo = combo; } public void actionPerformed(ActionEvent e) String arr[] = new String[2]; arr[0] = text.getText(); arr[1] = (String)combo.getSelectedItem(); DefaultTableModel model = (DefaultTableModel)table.getModel(); model.addRow(arr);
실습(RemoveActionListener.java) class RemoveActionListener implements ActionListener { JTable table; RemoveActionListener(JTable table) this.table = table; } public void actionPerformed(ActionEvent e) int row = table.getSelectedRow(); if ( row == -1) JOptionPane.showMessageDialog(null,"삭제 오류","선택된 행이 없음",JOptionPane.INFORMATION_MESSAGE); return; DefaultTableModel model = (DefaultTableModel) table.getModel(); model.removeRow(row);
실습(SwingMain.java) public class SwingMain { public static void main( String args[] ) { new DataModelEvent (); }
WindowBuilder
WindowBuilder 자바 GUI 프로그래밍을 위한 이클립스 플러그인 SWT 디자이너와 스윙 디자이너로 구성 자바 소스 코드에 의존하지 않고 비주얼 디자이너와 레이아웃 도구 등 간단한 양식을 작성하는 창을 이용해서 자동으로 자바 코드를 생성 속성 변경도 속성 편집기를 이용해서 할 수 있으며 이벤트 처리 기능 추가를 드래그 앤 드롭으로 쉽게 구현할 수 있도록 합니다. 컴파일 및 실행을 위해서 별도의 라이브러리를 사용하지 않음 아래 사이트에서 자신의 이클립스에 맞는 버전의 link를 클릭 http://www.eclipse.org/windowbuilder/download.php Mars http://download.eclipse.org/windowbuilder/WB/release/R201506241200-1/4.5/ Neon http://download.eclipse.org/windowbuilder/WB/release/4.6/
WindowBuilder 설치 Link를 이용해서 얻어낸 주소를 이용해서 이클립스 업데이트 [Help] – [Install New Software]을 선택하고 주소를 Work With에 입력하고 Enter 3개의 항목을 선택하고 [Next]
WindowBuilder 설치 설치되는 항목을 선택하고 [Next]
WindowBuilder 설치 License 에 동의하고 Finish
WindowBuilder 설치 설치가 완료되면 이클립스를 재부팅하게 됩니다. 설치 확인은 재부팅 후 [Window] – [Show View] 항목에서 Other를 선택하고 WindowBuilder를 확인
화면 출력 프로젝트 생성 JFrame으로 부터 상속받는 클래스 생성(WBDisplay) 클래스를 선택하고 마우스 오른쪽을 클릭해서 [Open With] – [WindowBuilder Editor] 선택
화면 출력 하단에서 Design 탭을 선택하면 디자인 할 수 있는 화면으로 변경됩니다.
화면 출력 Component의 속성을 변경하고자 하는 경우에는 Components 창이나 화면에 보이는 GUI 창에서 Component를 선택하고 Properties 창에서 변경하면 되는데 안보이는 속성이 있으면 Properties 창에서 [Show Advanced Properties]를 누르면 확인이 가능합니다.
화면 출력 Component를 추가하고자 하는 경우에는 Palette에서 선택한 후 GUI 화면에서 원하는 위치에 드랍
화면 출력 버튼을 북쪽에 배치
화면 출력 JFrame을 선택하고 visible 속성을 true로 변경하고 size를 입력
화면 출력 Main 클래스를 생성하고 이전에 만든 클래스의 객체 생성 public class Main { public static void main(String[] args) { new WBDisplay(); }
이벤트 처리 이벤트 처리를 수행 할 컴포넌트를 선택하고 마우스 오른쪽 버튼을 누르고 [Add event handler]에서 처리할 이벤트 핸들러 메소드를 선택하고 작성