본문 바로가기

BackEnd/Java

[java]이것이 자바다 부록 Java UI 5 (Swing을 이용한 버튼 컴포넌트)

728x90
반응형

1. 버튼 컴포넌트

   ▷ AbstractButton을 상속받은 하위 클래스들을 말함

   ▷ JButton, JToggleButton, JRadioButton, JCheckBox가 있고, 모두 사용자가 마우스로 클릭하여 사용 할 수 있음

 

(1) JButton

   ▷ 이미지와 텍스트로 구성된 일반적인 버튼을 만들 때 사용함

   ▷ setText() 메소드는 버튼의 텍스트를 설정하고, setIcon() 메소드는 버튼의 이미지를 설정함

 

◎ 텍스트, 이미지, 텍스트+이미지 버튼을 생성 예제

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class JButtonExample extends JFrame {
	private JButton btn1, btn2, btn3;
	
	// 메인 윈도우 설정
	public JButtonExample() {
		this.setTitle("JButtonExample");
		this.setSize(300, 100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new FlowLayout());
		this.getContentPane().add(getBtn1());
		this.getContentPane().add(getBtn2());
		this.getContentPane().add(getBtn3());
	}
	
	// 글자만 있는 버튼 생성
	public JButton getBtn1() {
		if(btn1 == null) {
			btn1 = new JButton();
			btn1.setText("새문서");
			btn1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JFileChooser jFileChooser = new JFileChooser();
					jFileChooser.showOpenDialog(JButtonExample.this);
				}
			});
		}
		return btn1;
	}
	
	// 아이콘만 있는 버튼 생성
	public JButton getBtn2() {
		if(btn2 == null) {
			btn2 = new JButton();
			btn2.setIcon(new ImageIcon(getClass().getResource("new.gif")));
			btn2.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JFileChooser jFileChooser = new JFileChooser();
					jFileChooser.showOpenDialog(JButtonExample.this);
				}
			});
		}
		return btn2;
	}
	
	// 아이콘과 글자가 있는 버튼 생성
	public JButton getBtn3() {
		if(btn3 == null) {
			btn3 = new JButton();
			btn3.setText("새문서");
			btn3.setIcon(new ImageIcon(getClass().getResource("new.gif")));
			btn3.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JFileChooser jFileChooser = new JFileChooser();
					jFileChooser.showOpenDialog(JButtonExample.this);
				}
			});
		}
		return btn3;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JButtonExample jFrame = new JButtonExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

출력 화면

 

(2) JToggleButton

   ▷ JToggleButton은 선택된 상태와 그렇지 않은 두 가지 상태를 가지는 버튼

   ▷ ActionListener보다는 ItemListener로 이벤트를 처리하는 것이 좋음

   ▷ ItemEvent의 getStateChange() 메소드는 JToggleButton이 선택되었을 경우 ItemEvent.SELECTED 상수값을 리턴

   ▷ JToggleButton은 단독으로 사용 가능하지만, 버튼 두 개를 ButtonGroup에 포함시키면 두 버튼을 배타적으로 선택가능

      ▶ ButtonGroup 내부에서는 하나의 버튼만이 선택된 상태로 존재할 수 있기 때문

 

[On] [Off] 토글 버튼과, 배타적으로 선택할 수 있는 [Start]와 [Stop] 버튼을 생성 예제

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

public class JToggleButtonExample extends JFrame {
	private JPanel pFirst;
	private JPanel pSecond;
	private JToggleButton tbOnOff;
	private JToggleButton tbStart;
	private JToggleButton tbStop;
	

	// 메인 윈도우 설정
	public JToggleButtonExample() {
		this.setTitle("JToggleButtonExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new GridLayout(2,1));
		this.getContentPane().add(getPFirst());
		this.getContentPane().add(getPSecond());
		this.pack();
	}
	
	public JPanel getPFirst() {
		if(pFirst == null) {
			pFirst = new JPanel();
			pFirst.add(getTbOnOff());
		}
		return pFirst;
	}
	
	public JPanel getPSecond() {
		if(pSecond == null) {
			pSecond = new JPanel();
			pSecond.setBorder(new TitledBorder("원하는 기능은?"));
			pSecond.add(getTbStart());
			pSecond.add(getTbStop());
			
			// 배타적 선택을 위한 ButtonGroup 생성 및 토글 버튼 추가
			ButtonGroup buttonGroup = new ButtonGroup();
			buttonGroup.add(getTbStart());
			buttonGroup.add(getTbStop());
		}
		return pSecond;
	}
	
	//On/off 토글 버튼 생성
	public JToggleButton getTbOnOff() {
		if(tbOnOff == null) {
			tbOnOff = new JToggleButton();
			tbOnOff.setText("On");
			tbOnOff.addItemListener(new ItemListener() {
				@Override
				public void itemStateChanged(ItemEvent e) {
					if(e.getStateChange() == ItemEvent.SELECTED) {
						getTbOnOff().setText("Off");
					} else {
						getTbOnOff().setText("On");
					}
				}
			});
		}
		return tbOnOff;
	}
	
	// Start 토글 버튼 생성
	public JToggleButton getTbStart() {
		if(tbStart == null) {
			tbStart = new JToggleButton();
			tbStart.setText("Start");
			tbStart.setIcon(new ImageIcon(getClass().getResource("start.gif")));
			tbStart.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JOptionPane.showMessageDialog(JToggleButtonExample.this, "Start");
				}
			});
		}
		return tbStart;
	}
	
	// Stop 토글 버튼 생성
	public JToggleButton getTbStop() {
		if(tbStop == null) {
			tbStop = new JToggleButton();
			tbStop.setText("Stop");
			tbStop.setIcon(new ImageIcon(getClass().getResource("stop.gif")));
			tbStop.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JOptionPane.showMessageDialog(JToggleButtonExample.this, "Stop");
				}
			});
		}
		return tbStop;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JToggleButtonExample jFrame = new JToggleButtonExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

 

(3) JRadioButton

   ▷ JToggleButton의 하위 클래스로, 둥근 모양의 선택과 텍스트를 함께 보여주는 버튼

   ▷ JRadioButton은 동일한 ButtonGroup에 포함되어 한 번에 하나의 JRadioButton만 선택된 상태를 가짐

   ▷ JRadioButton은 마우스로 클릭했을 때 ActionEvent가 발생하므로 ActionListener로 이벤트를 처리할 수 있음

 

◎ 두 개의 JRadioButton 중 하나를 선택하면 JLabel의 이미지가 변경되는 예제

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;

public class JRadioButtonExample extends JFrame {
	private JPanel radioPanel;
	private JRadioButton rbBird;
	private JRadioButton rbCat;
	private JLabel lblPicture;

	// 메인 윈도우 설정
	public JRadioButtonExample() {
		setTitle("JRadioButtonExample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(getRadioPanel(), BorderLayout.WEST);
		this.getContentPane().add(getLblPicture(), BorderLayout.CENTER);
		pack();
	}
	
	// JRadioButton이 배치된 JPanel 생성
	public JPanel getRadioPanel() {
		if(radioPanel == null) {
			radioPanel = new JPanel();
			radioPanel.setLayout(new GridLayout(2,1));
			radioPanel.add(getRbBird());
			radioPanel.add(getRbCat());
			
			// 배타적 선택을 위해 ButtonGroup에 두 개의 JRadioButton 추가
			ButtonGroup group = new ButtonGroup();
			group.add(getRbBird());
			group.add(getRbCat());
		}
		return radioPanel;
	}
	
	// JRadioButton 생성
	public JRadioButton getRbBird() {
		if(rbBird == null) {
			rbBird = new JRadioButton();
			rbBird.setText("Bird");
			rbBird.setSelected(true);  // 기본적으로 선택되도록 설정
			rbBird.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getLblPicture().setIcon(new ImageIcon(getClass().getResource
							("Bird.gif")));
				}
			});
		}
		return rbBird;
	}
	
	// JRadioButton 생성
	public JRadioButton getRbCat() {
		if(rbCat == null) {
			rbCat = new JRadioButton();
			rbCat.setText("Cat");
			rbCat.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getLblPicture().setIcon(new ImageIcon(getClass().getResource
							("Cat.gif")));
				}
			});
		}
		return rbCat;
	}
	
	
	// 이미지를 보여줄 JLabel 생성
	public JLabel getLblPicture() {
		if(lblPicture == null) {
			lblPicture = new JLabel();
			lblPicture.setIcon(new ImageIcon(getClass().getResource("Bird.gif")));
		}
		return lblPicture;
	}
	
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JRadioButtonExample jFrame = new JRadioButtonExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

출력 화면

 

 

(4) JCheckBox

   ▷ 사각형의 체크박스와 텍스트를 함께 보여주는 컴포넌트, JToggleButton 상속하며 체크/언체크의 두 가지 상태를 가짐    ▷ 개별적으로 선택할 수 있다는 것이 JRadioButton과 다름

   ▷마우스로 클릭했을 때 ActionEvent가 발생하므로 ActionListener로 이벤트를 처리할 수 있음

   ▷ 선택 확인 방법은 isSelected() 메소드의 리턴값을 확인(true : 선택됨)

 

◎ CheckBox의 체크 상태에 따라 이미지를 변경하는 예제

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JCheckBoxExample extends JFrame {
	private JPanel pWest;
	private JCheckBox cbGlasses;
	private JCheckBox cbHair;
	private JLabel lblPicture;

	// 메인 윈도우 설정
	public JCheckBoxExample() {
		setTitle("JCheckBoxExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(getWest(), BorderLayout.WEST);
		this.getContentPane().add(getLblPicture(), BorderLayout.CENTER);
		this.pack();
	}
	
	// 서쪽에 부착할 JPnal 생성
	public JPanel getWest() {
		if(pWest == null) {
			pWest = new JPanel(new GridLayout(2,1));
			// JCheckBox 추가
			pWest.add(getCbGlasses());
			pWest.add(getCbHair());	
		}
		return pWest;
	}
	
	// JCheckBox 생성
	public JCheckBox getCbGlasses() {
		if(cbGlasses == null) {
			cbGlasses = new JCheckBox();
			cbGlasses.setText("Glasses");
			cbGlasses.addActionListener(actionListener);

		}
		return cbGlasses;
	}
	
	// JCheckBox 생성
	public JCheckBox getCbHair() {
		if(cbHair == null) {
			cbHair = new JCheckBox();
			cbHair.setText("Hair");
			cbHair.addActionListener(actionListener);

		}
		return cbHair;
	}
	
	// 이미지 보여줄 JLabel 생성
	public JLabel getLblPicture() {
		if(lblPicture == null) {
			lblPicture = new JLabel();
			lblPicture.setIcon(new ImageIcon(getClass().getResource("geek.gif")));
		}
		return lblPicture;
	}
	
	// JCheckBox 이벤트 처리 리스너를 위한 필드 선언
	private ActionListener actionListener = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			if(cbGlasses.isSelected() && cbHair.isSelected()) {
				lblPicture.setIcon(new ImageIcon(getClass().getResource
						("geek-glasses-hair.gif")));
			} else if(cbGlasses.isSelected()) {
				lblPicture.setIcon(new ImageIcon(getClass().getResource
						("geek-glasses.gif")));
			} else if(cbHair.isSelected()) {
				lblPicture.setIcon(new ImageIcon(getClass().getResource
						("geek-hair.gif")));
			} else {
				lblPicture.setIcon(new ImageIcon(getClass().getResource("geek.gif")));
			}
			
		}
	};
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JCheckBoxExample jFrame = new JCheckBoxExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

 

버튼, 체크박스, 라디오 버튼을 이용해서 이미지를 변경하도록 만들었습니다.

 

더 많은 기능들에 대해서 배워볼게요~!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형