JAVA Programming Spring, 2016 Dongwoo Kang
모든스윙컴포넌트에는텍스트옆에이미지를추가로표시할수있다. 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);
public staticvoid main(string[] args) { ImageLabelTest t=new ImageLabelTest(); public void actionperformed(actionevent e) { ImageIcon dog = new ImageIcon("dog.gif"); label.seticon(dog); label.settext(null);
체크박스 (check box) 란사용자가클릭하여서체크된상태와체크되지않은상태중의하나로만들수있는컨트롤
이름 설명 생성자 JCheckBox() 레이블이없는 Checkbox 를생성한다. JCheckbox(String label) 지정된레이블의 Checkbox 를생성한 다. JCheckbox(String label, boolean sele cted) 지정된상태와레이블을가지는 Checkbox 을생성한다. 메소드 String gettext() 체크박스에표시되는텍스트를가져 온다. Boolean isselected() 만약체크박스가선택되었으면 true 를 반환한다. void setselected(boolean value) 매개변수가 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++) checkpanel.add(buttons[i]);
add(checkpanel); add(picturelabel[0]); add(picturelabel[1]); add(picturelabel[2]); /** 체크박스의아이템이벤트를처리한다. */ public void itemstatechanged(itemevent e) { ImageIcon image = null; 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]);
public static void main(string[] args) { JFrame frame = new JFrame("CheckBoxDemo"); frame.setdefaultcloseoperation(jframe.exit_on_close); CheckBoxPanel panel = new CheckBoxPanel(); panel.setopaque(true); frame.add(panel); frame.setsize(500, 200); frame.setvisible(true);
라디오버튼은체크박스와비슷하지만하나의그룹안에서는한개의버튼만선택할수있다는점이다르다
라디오버튼을생성한다. ü 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 { public static void main(string[] args) { new RadioButtonFrame();
경계 (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");
텍스트필드를이용하여사용자로부터정수를입력받은후에정수의제곱을구하여결과를출력전용의텍스트필드를이용하여표시하는프로그램을작성하여보자.
import javax.swing.*; import java.awt.event.*; class TextFieldFrame extends JFrame { private JButton button; private JTextField text, result; public MyFrame() { setsize(300, 130); settitle(" 제곱계산하기 "); setdefaultcloseoperation(jframe.exit_on_close); ButtonListener listener = new ButtonListener(); // 리스너객체생성 JPanel panel = new JPanel(); panel.add(new JLabel(" 숫자입력 : ")); text = new JTextField(15); text.addactionlistener(listener); panel.add(text); // 레이블생성 // 컬럼수가 15인텍스트필드생성 // 텍스트필드에리스너연결 panel.add(new JLabel(" 제곱한값 : ")); result = new JTextField(15); // 결과를나타낼텍스트필드 result.seteditable(false); // 편집불가설정 panel.add(result);
button = new JButton("OK"); button.addactionlistener(listener); panel.add(button); add(panel); setvisible(true); // 텍스트필드와버튼의액션이벤트처리 private class ButtonListener implements ActionListener { public void actionperformed(actionevent e) { if (e.getsource() == button e.getsource() == text) { String name = text.gettext(); int value = Integer.parseInt(name); result.settext(" " + value * value); text.requestfocus(); public class TextFieldTest extends JFrame { public static void main(string[] args) { new TextFieldFrame();
패스워드필드에사용자가암호를입력하면글자들이모두 * 문자로표시된다.
텍스트영역 (TextArea): 여러줄의텍스트가들어갈수있는컴포넌트
사용자가텍스트필드에텍스트를입력하고엔터키를누르면이것을텍스트영역에추가하는프로그램을작성하여보자.
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 { public static void main(string[] args) { new TextAreaFrame();
텍스트영역에스크롤바를만들려면스크롤페인에텍스트영역을넣어야한다. textarea = new JTextArea(10, 30); // 텍스트영역을생성한다. JScrollPane scrollpane = new JScrollPane(textArea); // 1
콤보박스 (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(" 이미지가발견되지않았습니다."); public static void main(string[] args) { ComboBoxFrame frame=new ComboBoxFrame();
슬라이더 (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); publicstaticvoid main(string[] args) { new SliderFrame();
파일선택기 (File Chooser) 는파일시스템을탐색하여파일이나디렉토리를선택하는 GUI를제공한다. 파일선택기를표시하려면 JFileChooser 클래스를사용한다.
사용자가 파일오픈 버튼을누르면파일을선택하는대화상자가나오도록프로그램을작성해보자.
public class FileChooserTest extends JFrame implements ActionListener { JButton openbutton, savebutton; JFileChooser fc; public FileChooserTest() { settitle(" 파일선택기테스트 "); setdefaultcloseoperation(jframe.exit_on_close); setsize(300, 200); fc = new JFileChooser(); JLabel label = new JLabel(" 파일선택기컴포넌트테스트입니다."); openbutton= new JButton(" 파일오픈 "); openbutton.addactionlistener(this); savebutton= new JButton(" 파일저장 "); savebutton.addactionlistener(this); JPanel panel = new JPanel(); panel.add(label); panel.add(openbutton); panel.add(savebutton); add(panel); setvisible(true);
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 { // 사용자취소 public static void main(string[] args) { FileChooserTest frame = new FileChooserTest();
이번장에서는피자를주문할수있는애플리케이션을작성하여보자. 다음의스케치를참조하라.. 윈도우제목 피자주문자바피자에오신것을환영합니다. 종류콤보포테이토불고기 추가토핑피망치즈페페로니베이컨 크기 Small Me dium La r g e 주문 취소
class WelcomePanel extends JPanel { private JLabelmessage; public WelcomePanel() { add(message); message = ; // 레이블생성
class TypePanel extends JPanel { private JRadioButton combo, potato, bulgogi; public TypePanel() { setlayout(new GridLayout(3, 1); combo = new JRadioButton(" 콤보, true); potato = new (" 포테이토 ); bulgogi = new (" 불고기 ); ButtonGroup bg = new ButtonGroup(); bg.add(combo); bg.add(potato); bg.add(bulgogi); setborder( BorderFactory.createTitledBorder(" 종류 ")); add(combo); add(potato); add(bulgogi);
class ToppingPanel extends JPanel { // 토핑패널정의 JPanel 상속... private JRadioButton pepper, cheese, peperoni, bacon; // private ButtonGroup bg; // 버튼그룹참조변수 public ToppingPanel() { // 생성자 setlayout(new GridLayout(4, 1)); // 배치관리자일렬 pepper = new JRadioButton(" 피망 ", true); // 라디오버튼생성 cheese = new JRadioButton(" 치즈 "); peperoni = new JRadioButton(" 페페로니 "); bacon = new JRadioButton(" 베이컨 ");
참조변수 버튼생성 class SizePanel extends JPanel { // 사이즈패널정의 JPanel 상속 private JRadioButton samll, medium, large; // 라디오버튼 private ButtonGroup bg; // 버튼그룹참조변수 public SizePanel() { // 생성자 setlayout(new GridLayout(3, 1)); // 배치관리자 samll = new JRadioButton("Small", true); // 라디오 medium = new JRadioButton("Medium"); large = new JRadioButton("Large"); bg = new ButtonGroup(); // 버튼그룹생성 bg.add(samll); bg.add(medium); bg.add(large);
WelcomePanel 을 BorderLayout 의 North 에배치 자바피자에오신것을환영합니다. 종류콤보포테이토불고기 추가토핑피망치즈페페로니베이컨 크기 Small Me dium La r g e 주문 취소 TypePanel 을 BorderLayout 의 West 에배치 SizePanel 을 BorderLayout 의 East 에배치 ToppingPanel 을 BorderLayout 의 Center 에배치
왼쪽텍스트영역에사용자가한글을입력하고 변환 버튼을누르면미리입력된몇개의단어만을영어로변환한다.
public class TextConverter extends JFrame { JButton converter; JButton canceler; JTextArea textin; JTextArea textout; public TextConverter() { super(" 텍스트변환 "); // 텍스트영역 textin = new JTextArea(10, 14); textout = new JTextArea(10, 14); textin.setlinewrap(true);// 자동줄바꿈 textout.setlinewrap(true); textout.setenabled(false);// 비활성화 // 텍스트영역을관리할패널 JPanel textareapanel = new JPanel(new GridLayout(1, 2, 20, 20)); textareapanel.add(textin); textareapanel.add(textout);
// 버튼 converter = new JButton(" 변환 "); canceler = new JButton(" 취소 "); converter.addactionlistener(new ButtonActionListener()); canceler.addactionlistener(new ButtonActionListener()); // 버튼패널 JPanel buttonpanel = new JPanel(new FlowLayout()); buttonpanel.add(converter); buttonpanel.add(canceler); // 메인패널 JPanel mainpanel = new JPanel(new BorderLayout(10, 10)); mainpanel.add(borderlayout.center, textareapanel); mainpanel.add(borderlayout.south, buttonpanel); // 프레임설정 setlayout(new FlowLayout(FlowLayout.CENTER, 20, 20)); add(mainpanel); pack(); setdefaultcloseoperation(exit_on_close); setvisible(true);
// 버튼의액션이벤트를처리할버튼액션리스너클래스 private class ButtonActionListener implements ActionListener { @Override public void actionperformed(actionevent e) { // TODO Auto-generated method stub if (e.getsource() == converter) { textout.settext(""); String result = toenglish(textin.gettext()); textout.append(result); if (e.getsource() == canceler) { textout.settext(""); // 영어를한국어로변환하는메소드 private String toenglish(string korean) { String result = korean; result = result.replace(" 텍스트 ", "Text"); result = result.replace(" 영어 ", "English"); return result; public static void main(string[] args) { TextConverter t = new TextConverter();