2011년 7월 3일 일요일

스윙으로 라디오버튼 만들기(JRadioButton)




자바의 스윙을 이용해서 라디오버튼(JRadioButton)을 만들어 보겠다. 라디오버튼이 뭐냐고 물으신다면 위의 그림을 보기 바란다. 저렇게 버튼을 선택하는 것을 라디오버튼이라고 부른다. 뤠이디오버른~이라고도 한다.ㅎㅎ 이것이 끝이 아니다. 명령어 단 한줄의 마법(?)으로 아래와 같은 결과도 얻을수 있다. 일석이조라고나 할까? ^^




혹시나 위와같은 프레임을 구경해본적이 있을지 모르겠다. 가끔가다가 애플같은 아기자기한 소프트웨어를 보다보면 이쁘장하게 꾸민 이런 프레임을 만날수 있는데 이게 JFrame 클래스를 이용하면 명령어 단 한줄로 가능하다. 궁금하셨던 분들은 오늘 예제를 유심히 보시라~^^


위의 예제는 언제나 그렇듯 필자가 핵심내용만 아낌없이 집중적으로 쏟아부은 자바 스윙의 라디오버튼에 관한 소스이므로 그냥 보기만 해도 신기하게 이해가 될것이다.ㅎㅎ 간단히 설명하자면 라디오버튼을 만들기 위해 JRadioButton 클래스를 이용하고 각 항목에 따른 객체생성자를 항목이름과 함께 만든다. 각 항목을 열거하기 위해 역시 자바 스윙 패키지에 있는 ButtonGroup 클래스를 이용해 각 항목을 add( ) 메소드를 이용해 열거하고 다시 프레임안에다가 역시 add( ) 메소드를 이용해 아까 만들어놓은 버튼들을 다 집어넣으면 땡~이다. 여기서 ButtonGroup은 쓰지않아도 정상적으로 작동되는 것처럼 보이나 한번 선택하면 다시 고칠수 없는 치명적인 버그(?)가 생긴다. 무엇인지는 직접 실행해서 찾아보기 바란다.ㅎㅎ 그리고 예제의 메인메소드에 있는 첫줄이 바로 앞에서 소개한 명령어 단 한줄의 마법(?)이다. 넣느냐 안넣느냐에 따라서 결과물이 위처럼 바뀌니 직접 실행하면서 응용해보기 바란다.^^

댓글 4개:

  1. 버튼 그룹은 안만들어도

    결과는 똑같네요???

    답글삭제
  2. 버튼 그룹을 안만드시면 복수 선택이 가능하시게 됩니다

    답글삭제
  3. import javax.swing.border.*;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.JRadioButton;
    import javax.swing.ButtonGroup;


    class Cal
    {
    JFrame frame;
    JPanel panel, inPanel;

    JMenu menu;
    JMenuItem item;
    JMenuBar menuBar;

    JButton button;
    JLabel label;

    String[] mainMenu = {"파일(F)","편집(E)","도구(T)","도움말(H)"};
    String[][] subMenu = {{"새파일(N)", "종료(X)"},{"복사(C)", "붙여넣기(V)"},
    {"설정(P)", "정렬(O)"}, {"버전(L)", "도움말(A)"}};
    String[][] buttnName = {{"Sta", "Ave", "Sum", "s", "Dat"},
    {"F-E", "(", ")", "dms", "Exp", "In", "sin", "x^y", "log", "cos", "x^3", "n!", "tan", "x^2", "1/x"},
    {"MC", "MR", "MS", "M+", "pi"},
    {"7", "8", "9", "/", "Mod", "And", "4", "5", "6", "*",
    "Or", "Xor", "1", "2", "3", "-", "Lsh", "Not", "0", "+/-",
    ".", "+", "=", "Int", "A", "B", "C", "D", "E", "F"}};

    public Cal() {

    frame = new JFrame("계산기");
    menuBar = new JMenuBar();
    panel = new JPanel(new FlowLayout(1, 10, 0));
    }

    // 서브 메뉴 생성
    void createSubMenu(String strMenu, int menuCnt) {
    menu = new JMenu(strMenu);

    for(int cnt = 0; cnt < subMenu[menuCnt].length; cnt++) {
    item = new JMenuItem(subMenu[menuCnt][cnt]);
    menu.add(item);
    }
    menuBar.add(menu);
    }

    // 메인 메뉴 생성
    void setMenu() {
    for(int cnt = 0; cnt < mainMenu.length; cnt++)
    createSubMenu(mainMenu[cnt], cnt);

    frame.setJMenuBar(menuBar);
    }

    void mainLayout() {
    // 프레임 북쪽에 텍스트 필드 부착
    frame.add(new JTextField("0.", 20), "North");

    // 프레임 센터에 라디오 버튼 등 부착
    public class Cal
    {
    public static void main(String[] args)
    {
    JFrame frame = new JFrame("경훈이의 자바강좌");
    frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE)
    frame.setLayout(new flowLayout());

    JRadioButton button1 = new JRadioButton("최고(100)");
    JRadioButton button2 = new JRadioButton("최부(800)");
    JRadioButton button3 = new JRadioButton("최ㅋ(600)");

    ButtonGroup bg = new ButtonGroup()
    bg.add(button1);
    bg.add(button2);
    bg.add(button3);

    frame.add(new JLabel("소감:"));
    frame.add(button1);
    frame.add(button2);
    frame.add(button3);

    frame.setSize(400,100);
    frame.setuisible(true);

    }
    };
    public



    // 프레임 하단에 패널 부착 후 버튼 부착
    panel.add(addSouthButton(0, 5, 1, 3, 3));
    panel.add(addSouthButton(1, 5, 3, 3, 3));
    panel.add(addSouthButton(2, 5, 1, 3, 3));
    panel.add(addSouthButton(3, 5, 6, 3, 3));

    frame.add(panel, "South");
    }

    JPanel addSouthButton(int count, int xSize, int ySize, int xMargin, int yMargin) {
    inPanel = new JPanel(new GridLayout(xSize, ySize, xMargin, yMargin));
    for(int cnt = 0; cnt < buttnName[count].length; cnt++) {
    button = new JButton(buttnName[count][cnt]);
    inPanel.add(button);
    }
    return inPanel;
    }

    void setGUI() {
    setMenu();
    mainLayout();

    frame.pack();


    frame.show();



    }

    public static void main(String[] args)
    {
    Cal cal = new Cal();
    cal.setGUI();
    new RadioButton();
    }
    }

    소스수ㅈ

    답글삭제
  4. 소스 수정부탁드려요

    답글삭제