Overview Swing Component 514760-1 2018 년봄학기 5/22/2018 박경신 JLabel, ImageIcon JTextField, JTextArea JButton, JCheckBox, JRadioButton JSlider, JComboBox JPanel, JScrollPane, JOptionPane JTable Timer JFileChooser, JMenu JDialog 사용자정의콤포넌트 스윙컴포넌트에이미지표시하기 모든스윙컴포넌트에는텍스트옆에이미지를추가로표시할수있다. ImageIcon image = new ImageIcon("image.gif"); JLabel label = new JLabel(" 이미지레이블 "); label.seticon(image); 이미지표시하기 public class ImageLabelTest extends JFrame implements ActionListener { private JPanel panel; private JLabel label; private JButton button; public ImageLabelTest() { settitle(" 이미지레이블 "); setsize(300,250); setdefaultcloseoperation(jframe.exit_on_close); panel = new JPanel(); label = new JLabel(" 이미지를보려면아래버튼을누르세요 "); button = new JButton(" 이미지레이블 "); ImageIcon icon = new ImageIcon("icon.gif"); button.seticon(icon); button.addactionlistener(this); panel.add(label); panel.add(button); add(panel); setvisible(true); ImageLabelTest t=new ImageLabelTest(); public void actionperformed(actionevent e) { ImageIcon dog = new ImageIcon("dog.gif"); label.seticon(dog); label.settext(null);
체크박스 체크박스 (check box) 란사용자가클릭하여서체크된상태와체크되지않은상태중의하나로만들수있는컨트롤 JCheckBox 의메소드 이름 설명 생성자 JCheckBox() 레이블이없는 Checkbox를생성한다. JCheckbox(String label) 지정된레이블의 Checkbox를생성한다. JCheckbox(String label, boolean sele cted) 지정된상태와레이블을가지는 Checkbox을생성한다. 메소드 String gettext() 체크박스에표시되는텍스트를가져 온다. Boolean isselected() void setselected(boolean value) 만약체크박스가선택되었으면 true 를반환한다. 매개변수가 true이면체크박스를체크상태로만든다. void settext(string text) 체크박스텍스트를설정한다. public class CheckBoxPanel extends JPanel implements ItemListener { JCheckBox[] buttons = new JCheckBox[3]; String[] fruits = { "apple", "grape", "orange" ; JLabel[] picturelabel = new JLabel[3]; ImageIcon[] icon = new ImageIcon[3]; public CheckBoxDemo() { super(new GridLayout(0, 4)); for (int i = 0; i < 3; i++) { buttons[i] = new JCheckBox(fruits[i]); buttons[i].additemlistener(this); picturelabel[i] = new JLabel(fruits[i] + ".gif"); icon[i] = new ImageIcon(fruits[i] + ".gif"); JPanel checkpanel = new JPanel(new GridLayout(0, 1)); for (int i = 0; i < 3; i++) JFrame frame = new JFrame("CheckBoxDemo"); checkpanel.add(buttons[i]); frame.setdefaultcloseoperation(jframe.exit_on_close); add(checkpanel); add(picturelabel[0]); CheckBoxPanel panel = new CheckBoxPanel(); add(picturelabel[1]); panel.setopaque(true); add(picturelabel[2]); frame.add(panel); public void itemstatechanged(itemevent e) { frame.setsize(500, 200); ImageIcon image = null; frame.setvisible(true); Object source = e.getitemselectable(); for (int i = 0; i < 3; i++) { if (source == buttons[i]) { if (e.getstatechange() == ItemEvent.DESELECTED) picturelabel[i].seticon(null); else picturelabel[i].seticon(icon[i]); 라디오버튼 라디오버튼은체크박스와비슷하지만하나의그룹안에서는한개의버튼만선택할수있다는점이다르다
라디오버튼 라디오버튼을생성한다. JRadioButton radio1 = new JRadioButton(" 선택 1"); JRadioButton radio2 = new JRadioButton(" 선택 2"); JRadioButton radio3 = new JRadioButton(" 선택 3"); ButtonGroup 객체를생성한다. ButtonGroup group = new ButtonGroup(); 라디오버튼들을 ButtonGroup 객체에추가한다. group.add(radio1); group.add(radio2); group.add(radio3); import javax.swing.*; import javax.swing.border.border; import java.awt.event.*; import java.awt.*; class RadioButtonFrame extends JFrame implements ActionListener { private JRadioButton small, medium, large; private JLabel text; private JPanel toppanel, sizepanel, resultpanel; public MyFrame() { settitle(" 라디오버튼테스트 "); setsize(300, 150); setdefaultcloseoperation(jframe.exit_on_close); toppanel = new JPanel(); JLabel label = new JLabel(" 어떤크기의커피를주문하시겠습니까?"); toppanel.add(label); add(toppanel, BorderLayout.NORTH); sizepanel = new JPanel(); small = new JRadioButton("Small Size"); medium = new JRadioButton("Medium Size"); large = new JRadioButton("Large Size"); ButtonGroup size = new ButtonGroup(); size.add(small); size.add(medium); size.add(large); small.addactionlistener(this); medium.addactionlistener(this); large.addactionlistener(this); sizepanel.add(small); sizepanel.add(medium); sizepanel.add(large); add(sizepanel, BorderLayout.CENTER); resultpanel = new JPanel(); text = new JLabel(" 크기가선택되지않았습니다."); text.setforeground(color.red); resultpanel.add(text); add(resultpanel, BorderLayout.SOUTH); setvisible(true); public void actionperformed(actionevent e) { if (e.getsource() == small) { text.settext("small 크기가선택되었습니다."); if (e.getsource() == medium) { text.settext("medium 크기가선택되었습니다."); if (e.getsource() == large) { text.settext("large 크기가선택되었습니다."); public class RadioButtonTest extends JFrame { new RadioButtonFrame(); 콤보박스 콤보박스 (combo box) 도여러항목중에서하나를선택하는데사용할수있다. 콤보박스메소드 콤보박스를생성하기위해서는먼저생성자중에서하나를골라서호출하여야한다. 생성자는비어있는콤보박스를생성한다. JComboBox combo = new JComboBox(); 여기에항목을추가하려면 additem() 메소드를사용한다. combo.additem( dog ); combo.additem( lion ); combo.additem( tiger );
public class ComboBoxFrame extends JFrame implements ActionListener { JLabel label; public ComboBoxFrame() { settitle(" 콤보박스 "); setdefaultcloseoperation(jframe.exit_on_close); setsize(300, 200); String[] animals = { "dog", "lion", "tiger" ; JComboBox animallist = new JComboBox(animals); animallist.setselectedindex(0); animallist.addactionlistener(this); label = new JLabel(); label.sethorizontalalignment(jlabel.center); changepicture(animals[animallist.getselectedindex()]); add(animallist, BorderLayout.PAGE_START); add(label, BorderLayout.PAGE_END); setvisible(true); public void actionperformed(actionevent e) { JComboBox cb = (JComboBox) e.getsource(); String name = (String) cb.getselecteditem(); changepicture(name); protected void changepicture(string name) { ImageIcon icon = new ImageIcon(name + ".gif"); label.seticon(icon); if (icon!= null) { label.settext(null); else { label.settext(" 이미지가발견되지않았습니다."); ComboBoxFrame frame=new ComboBoxFrame(); 경계만들기 경계 (border) 란시각적으로컴포넌트들을그룹핑할때사용하는장식적인요소 Border border = BorderFactory.createTitledBorder(" 크기 "); sizepanel.setborder(border); 텍스트필드 텍스트필드 (text field) 는입력이가능한한줄의텍스트필드를만드는데사용된다. 패스워드필드에사용자가암호를입력하면글자들이모두 * 문자로표시된다. 패스워드필드 패스워드필드에사용자가암호를입력하면글자들이모두 * 문자로표시된다. JTextField textfield = new JTextField(30); // 30 자크기의텍스트필드를만든다. JTextField textfield = new JTextField( Initial String"); // 초기화문자열 System.out.println(textField.getText()); textfield.settext("seoul");
텍스트영역 텍스트영역 (TextArea): 여러줄의텍스트가들어갈수있는컴포넌트 스크롤페인 텍스트영역에스크롤바를만들려면스크롤페인에텍스트영역을넣어야한다. textarea = new JTextArea(10, 30); // 텍스트영역을생성한다. JScrollPane scrollpane = new JScrollPane(textArea); // 슬라이더 슬라이더 (slider) 는사용자가특정한범위안에서하나의값을선택할수있는컴포넌트이다. public class SliderFrame extends JFrame implements ChangeListener { static final int INIT_VALUE = 15; private JButton buttonok; private JSlider slider; private JButton button; public SliderFrame() { JPanel panel; settitle(" 슬라이더테스트 "); setdefaultcloseoperation(jframe.exit_on_close); panel = new JPanel(); JLabel label = new JLabel(" 슬라이더를움직여보세요 ", JLabel.CENTER); label.setalignmentx(component.center_alignment); panel.add(label); slider = new JSlider(0, 30, INIT_VALUE); slider.setmajortickspacing(10); // 큰눈금간격 slider.setminortickspacing(1); // 작은눈금간격 slider.setpaintticks(true); // 눈금을표시한다. slider.setpaintlabels(true); // 값을레이블로표시한다. slider.addchangelistener(this); // 이벤트리스너를붙인다. panel.add(slider); button = new JButton(""); ImageIcon icon = new ImageIcon("dog.gif"); button.seticon(icon); button.setsize(init_value * 10, INIT_VALUE * 10); panel.add(button); add(panel); setsize(300, 300); setvisible(true); public void statechanged(changeevent e) { JSlider source = (JSlider) e.getsource(); if (!source.getvalueisadjusting()) { int value = (int) source.getvalue(); button.setsize(value * 10, value * 10); new SliderFrame();
파일선택기 파일선택기 (File Chooser) 는파일시스템을탐색하여파일이나디렉토리를선택하는 GUI 를제공한다. 파일선택기를표시하려면 JFileChooser 클래스를사용한다. public void actionperformed(actionevent e) { // 파일오픈 버튼에대한액션이벤트처리 if (e.getsource() == openbutton) { int returnval = fc.showopendialog(this); if (returnval == JFileChooser.APPROVE_OPTION) { File file = fc.getselectedfile(); // 실제파일을오픈한다. else { // 사용자취소 // 파일저장 버튼에대한액션이벤트처리 else if (e.getsource() == savebutton) { int returnval = fc.showsavedialog(this); if (returnval == JFileChooser.APPROVE_OPTION) { File file = fc.getselectedfile(); // 실제파일에저장한다. else { // 사용자취소 FileChooserTest frame = new FileChooserTest(); class TextAreaFrame extends JFrame implements ActionListener { protected JTextField textfield; protected JTextArea textarea; public MyFrame() { settitle("text Area Test"); setdefaultcloseoperation(jframe.exit_on_close); textfield = new JTextField(30); textfield.addactionlistener(this); textarea = new JTextArea(10, 30); textarea.seteditable(false); add(textfield, BorderLayout.NORTH); add(textarea, BorderLayout.CENTER); pack(); setvisible(true); public void actionperformed(actionevent evt) { String text = textfield.gettext(); textarea.append(text + "\n"); textfield.selectall(); textarea.setcaretposition(textarea.getdocument().getlength()); public class TextAreaTest extends JFrame { new TextAreaFrame(); 사용자가텍스트필드에텍스트를 입력하고엔터키를누르면이것을텍스트영역에추가하는프로그램을작성하여보자. Menu 메뉴 프로그램에서수행할수있는명령집합 계층적요소로구성된 user interface JMenuBar ( 최상위메뉴바 ) JMenuBar menubar = new JMenuBar(); this.setjmenubar(menubar); // this 프레임에메뉴바추가 JMenu JMenu filemenu = new JMenu( File ); filemenu.setmnemonic(keyevent.vk_f); menubar.add(filemenu); JMenuItem 명령을수행하거나서브메뉴를가지는항목 JMenuItem openmenuitem = new JMenuItem( Open, KeyEvent.VK_O); filemenu.add(openmenuitem); openmenuitem.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { );
Menu Dialog menubar File menu Photo menu Open menu item Save menu item Close menu item 대화상자 (JDialog) 다양한컨트롤을포함하고있는일종의윈도우 사용자로부터입력을받거나정보를출력 정적, 버튼, 편집등다양한컨트롤들을배치하고관리하는윈도우.. menu item.. menu item Message Dialog void JOptionPane.showMessageDialog(Component, Object, String, int, Icon) JOptionPane.showMessageDialog(null, "Simple Information Message"); Message Dialog JOptionPane.showMessageDialog(null, "Uh-oh!", "Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(null, 8.9, "This is not an integer.", JOptionPane.PLAIN_MESSAGE); ImageIcon icon = new ImageIcon("src/images/turtle64.png"); JOptionPane.showMessageDialog(null, "I like turtles.", "Customized Dialog", JOptionPane.INFORMATION_MESSAGE, icon);
Message Dialog int JOptionPane.showConfirmDialog(Component, Object, String, int, int, Icon) int input = JOptionPane.showConfirmDialog(null, "Do you like bacon?"); // 0:yes 1:no 2:cancel Message Dialog int input = JOptionPane.showConfirmDialog(null, "Do you want to proceed?", "Select an Option...",JOptionPane. OK_CANCEL_OPTION); // 0:ok 2:cancel int input = JOptionPane.showConfirmDialog(null, "Click ok if you are ok", "Be ok!", JOptionPane.DEFAULT_OPTION); // 0:ok ImageIcon icon = new ImageIcon("src/images/turtle64.png"); int input = JOptionPane.showConfirmDialog(null, "Do you like turtles?", "Be honest...",joptionpane.yes_no_cancel_option, JOptionPane.QUESTION_MESSAGE, icon); Message Dialog Object JOptionPane.showInputDialog(Component, Object, String, int, Icon, Object[], Object) String m = JOptionPane.showInputDialog("Anyone there?"); Message Dialog String[] options = {"I adore turtles", "Yes", "Maybe", "Urm...", "No", "Hate them"; ImageIcon icon = new ImageIcon("src/images/turtle32.png"); String m = (String)JOptionPane.showInputDialog(null, "Do you like turtles??", "I like turtles", JOptionPane.QUESTION_MESSAGE, icon, options, options[2]); String m = JOptionPane.showInputDialog("Anyone there?", 42); if(m.isempty() m.equals("42")){ frame.closeit();
JFileChooser int JFileChooser.showOpenDialog(Component) JFileChooser int JFileChooser.showSaveDialog(Component) public File[] openfiledialog() { JFileChooser filechooser = new JFileChooser(); filechooser.setmultiselectionenabled(true); int returnvalue = filechooser.showopendialog(null); if (returnvalue == JFileChooser.APPROVE_OPTION) { System.out.println("openFile"); File[] selectedfiles = filechooser.getselectedfiles(); return selectedfiles; else { System.out.println("file not opened"); return null; public File[] savefiledialog() { JFileChooser filechooser = new JFileChooser(); int returnvalue = filechooser.showsavedialog(null); if (returnvalue == JFileChooser.APPROVE_OPTION) { System.out.println( savefile"); String selectedfile = filechooser.getselectedfile().getabsolutepath().tostring(); return selectedfile; else { System.out.println("file not opened"); return null; JFileChooser 주요속성설명 File getselectedfile() 대화상자에서선택한모든파일 ( 들 ) 반환 File[] getselectedfiles() setcurrentdirectory(file) 시작디렉터리지정 setfilefilter(filefilter) 대화상자에서 파일형식으로저장 또는 파일형식 상자에표시되는선택옵션을결정하는현재파일이름필터문자열을가져오거나설정 Text Document(*.txt) *.txt + All Files *.* All Image Files *.bmp;*.gif;*.jpg;*.png setfileselectionmode(int) setmultiselectionenabled( boolean) FILES_ONLY 파일만선택가능 DIRECTORIES_ONLY 디렉토리만선택가능 FILES_AND_DIRECTORIES 파일과디렉토리선택가능 대화상자에서여러개의파일을선택가능여부지정 Custom Dialog 사용자정의대화상자 Modeless modeless dialog를닫지않더라도다른윈도우사용을막지않음 Document-modal document-modal dialog를닫지않으면같은 document 안의 ( 자기자식윈도우만제외하고 ) 모든윈도우사용을막음. Application-modal application-modal dialog를닫지않으면같은 application 안의 ( 자기자식윈도우만제외하고 ) 모든윈도우사용을막음 Toolkit-modal type toolkit-modal dialog 를닫지않으면같은 toolkit 안의 ( 자기자식윈도우만제외하고 ) 모든윈도우사용을막음.
Custom Component 사용자정의콤포넌트작성 기존 Swing Component 를상속받아확장 Number만입력하는 TextField를작성 (Custom TextField) NumberTextField는기존 JTextField를상속받아확장 public void processkeyevent(keyevent e) { char c = e.getkeychar(); if (!Character.isDigit(c) &&!isvalidsign(c) && c!= '.' && c!= '\b') { e.consume(); super.processkeyevent(e); return; private boolean isvalidsign(char c) { if( (gettext() == null "".equals(gettext().trim()) ) && c == '-') return true; return false; AnimatedImagePanel (Custom Panel) public class ImagePanel extends JPanel implements ActionListener { public ImagePanel() { loadimages(); timer = new Timer(500, this); public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2 = (Graphics2D) g; if (images[currentimage]!= null) g2.drawimage(images[currentimage], 0, 0, this); public void actionperformed(actionevent e) { // timer tick currentimage = (currentimage + 1) % totalimages; repaint();