프로토콜. 통신규약 TCP/IP : 원격 데이터를 주고 받을 때 사용. 인터넷의 기본 프로토콜이 됨 TCP:데이터를 보내는 역할(스트림 관리), IP: 전송 전/후 데이터 검증하는 역할 InterNIC : International Network Information Center. InterNIC에서 다양한 도메인을 관리 com org edu net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
public class Test1 {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String host;
System.out.print("호스트[www.naver.com]: ");//www.naver.com 도메인 www는 웹서버
host = br.readLine();
//InetAddress 이름 분해 작업을 해줌
InetAddress ia = InetAddress.getByName(host);
//This class represents an Internet Protocol (IP) address. IPv4-32bit, IPv6-128bit.
System.out.println("Ip주소: " + ia.getHostAddress());//DNS에 주소를 가져가면 ip와 host를 읽어옴
System.out.println("호스트: " + ia.getHostName());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
AWT(Abstract Window Toolkit) Window에 관한 모든 내용을 Frame이 가지고 있음. 반드시 생성자 만들어줘야 함. main문에는 코딩 별로 없음 윈도우 프로그램은 거의 C#, MFC에서 만들지만 AWT개념 알아두면 좋음 C#, Windows에서는 뜨는 창의 이름을 form이라고 부르고 자바에서는 frame. Event를 기준으로 움직임
import java.awt.Color;
public class Test2 extends Frame{
private static final long serialVersionUID = 1L;
public Test2(){
//Frame 클래스를 상속 받아 사용
setTitle("자바 윈도우");
setSize(200, 300);
setBackground(new Color(255, 255, 0));//배경색 노란색
setVisible(true);
}
public static void main(String[] args) {
new Test2();
}
}
WindowListener 인터페이스. 윈도우폼에 관한 모든 이벤트 존재. 단점: 사용하지 않는 메소드들도 모두 오버라이드 해야함
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class Test3 extends Frame implements WindowListener{
public Test3(){
setTitle("윈도우");
setSize(200,300);
setBackground(new Color(242,0,36));
addWindowListener(this);//Listener. event가 발생하는지 지켜보고 있음. Test3 자기자신에게 이벤트를 알려야 하므로 this.
setVisible(true);
}
public static void main(String[] args) {
new Test3();
}
@Override
public void windowActivated(WindowEvent e) {//창 활성화
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {//종료버튼 클릭시
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {//화면이 두개이상일 때 비활성화
}
@Override
public void windowDeiconified(WindowEvent e) {//아이콘이 커졌을때
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowOpened(WindowEvent e) {//창이 처음 열릴 때
}
}
WindowAdapter 클래스를 활용한 이벤트 인식 1. 새로운 클래스를 만들어서 상속받은 후 사용 가능 2. 익명의 내부클래스로 생성해서 사용해도 됨
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test4 extends Frame{
public Test4(){
setTitle("윈도우어답터");
setSize(500,500);
//addWindowListener(new MyWindowAdapter());//클래스를 가져옴. 객체 생성 후 바로 사용. 이름 필요없음
//익명의 내부클래스를 만들어서 바로 오버라이딩 해도 됨
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {//윈도우 프레임에서 인식되는 이벤트들 7~10개 정도 있음
System.exit(0);
}
});
setVisible(true);
}
public static void main(String[] args) {
new Test4();
}
/*
class MyWindowAdapter extends WindowAdapter {//내부클래스. (밀접한 관계시 이렇게 씀)
//WindowAdapter를 상속받아 사용하면 내가 사용안하는 메소드를 일일히 정의할 필요 없음
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
*/
}
윈도우의 TextField, TextArea, Button
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test5 extends Frame implements ActionListener{
private static final long serialVersionUID = 1L;
private TextField tf; //텍스트 입력받는 부분
private TextArea ta; //텍스트 보이는 부분
private Button btn; //버튼
public Test5(){
tf = new TextField();
ta = new TextArea();
btn = new Button("확인");
add(tf,BorderLayout.NORTH); //BorderLayout 다섯개의 위치정보 가지고 있음
add(ta,BorderLayout.CENTER);
add(btn,BorderLayout.SOUTH);
tf.addActionListener(this); //텍스트 필드,버튼에서 이벤트 여부 확인
btn.addActionListener(this);
//Listener는 특정 이벤트가 진행될 경우 ActionListener가 가지고 있는 actionPerformed메소드에 전달
setTitle("윈도우");
setSize(200, 300);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
public static void main(String[] args) {
new Test5();
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();//ActionEvent e 받아서 ob에 할당
if(ob instanceof Button || ob instanceof TextField){
String str = tf.getText();
if(!str.equals("")){//가끔 equals 메소드로 인식 안될 때 있음 ->(!(str.equals("")||str==""))
ta.append(str + "\r\n");
}
//텍스트필드 초기화 후 커서
tf.setText("");
tf.requestFocus();
}
}
}
성적을 입력받아 합계를 계산해주는 윈도우 만들기
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test6 extends Frame implements ActionListener {
private static final long serialVersionUID = 1L;
private TextField[] tf = new TextField[4];//텍스트 필드가 100개 필요하면 100개 만들어야함. 그래서 배열 이용
private Button btn1, btn2;
private Label result = new Label("", Label.CENTER);
public Test6(){//기본생성자
String[] title = {"이름","국어","영어","수학","총점"};
setTitle("성적처리");
setLayout(null);//수동으로 배치하겠다
for(int i=0;i<5;i++){
Label lbl = new Label();//반복문 사용하므로 배열 쓸 필요없음
lbl.setText(title[i]);
lbl.setBounds(10, (i+1)*30, 50, 20);//좌표(x,y)에 50*20크기의 박스를 생성
add(lbl);
if(i!=4){
tf[i] = new TextField();//배열에 객체생성후 할당
tf[i].setBounds(80, (i+1)*30, 70, 20);//좌표(x,y)에 70*20크기의 텍스트필드 생성
tf[i].addKeyListener(new KeyHandler());
add(tf[i]);
}else{
result.setBounds(80,(i+1)*30, 70, 20);
add(result);
}
}
btn1 = new Button("결과");
btn1.setBounds(180,30,60,20);
add(btn1);
btn1.addActionListener(this);
btn1.addKeyListener(new KeyHandler());
btn2 = new Button("종료");
btn2.setBounds(180,60,60,20);
add(btn2);
btn2.addActionListener(this);
btn2.addKeyListener(new KeyHandler());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setSize(260, 180);
setResizable(false);//크기변환불가
setVisible(true);
}
public static void main(String[] args) {
new Test6();
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
if(ob instanceof Button){
Button b = (Button)ob;//downcast Object->Button
if(b==btn1){
process();//메소드 호출
}else if(b==btn2){
System.exit(0);
}
}
}
private void process(){
int tot=0;
try {
for(int i=1; i<=3; i++){//배열0은 이름. tf[1]~tf[3]을 누적해서 더해야 함
tot+=Integer.parseInt(tf[i].getText());
result.setText(Integer.toString(tot));
//result.setText(""+tot);//정수와 null 이 더해지면 String으로 자동으로 바뀜
}
} catch (Exception e2) {
result.setText("입력 오류!!");
}
}
class KeyHandler extends KeyAdapter{//추상클래스
@Override
public void keyPressed(KeyEvent evt) {//추상메소드 오버라이드
//리스너가 키보드를 입력했을때를 이벤트로 감지해서 keyPressed메소드 실행
Object ob = evt.getSource();
if(evt.getKeyCode()!=KeyEvent.VK_ENTER){//VK:가지고있는 키보드 입력값을 보여줌
return;
}
if(ob instanceof Button){
Button b = (Button)ob; //downcast
if(b==btn1){
process();//국영수 총점을 구하는 메소드
btn2.requestFocus(); ////버튼1->버튼2로 포커스를 옮겨라
}
return;
}
if(ob instanceof TextField){
TextField t = (TextField)ob; //downcast
for(int i=0;i<tf.length;i++){
if(i!=3&&tf[i]==t){//i가3이 아니면서 & tf[i]가 t 자기자신이 맞다면 실행
tf[i+1].requestFocus();//다음번 텍스트필드에 포커스를 옮겨라
return;
}else if(tf[3]==t){
btn1.requestFocus();//버튼1로 포커스를 옮겨라
return;
}
}
}
}
}//end-KeyHandler
}//end-class
윈도우의 TextField, TextArea, Button를 이용한 계산기 만들기
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test7 extends Frame implements ActionListener{
private TextField tf1, tf2, tf3;
private Button btn1, btn2, btn3, btn4;//버튼 네개를 하나의 패널로 만들어서 삽입
public Test7(){
setLayout(new GridLayout(4,1));//Form을 세로4칸 가로1칸으로 나누겠다.
tf1 = new TextField();
add(tf1);
tf2 = new TextField();
add(tf2);
Panel p = new Panel();
btn1 = new Button("+");
btn1.addActionListener(this);
p.add(btn1);
btn2 = new Button("-");
btn2.addActionListener(this);
p.add(btn2);
btn3 = new Button("*");
btn3.addActionListener(this);
p.add(btn3);
btn4 = new Button("/");
btn4.addActionListener(this);
p.add(btn4);
add(p);//패널추가
tf3 = new TextField();
add(tf3);
//종료시
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setTitle("계산기");
setSize(200, 150);
//setResizable(false);//크기변환불가
setVisible(true);
}
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
new Test7();
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
if(ob instanceof Button){
Button b = (Button)ob;
try {
int num1 = Integer.parseInt(tf1.getText());
int num2 = Integer.parseInt(tf2.getText());
String str="";
if(b==btn1){
str=String.format("%d+%d=%d", num1, num2, (num1+num2));
}else if(b==btn2){
str=String.format("%d-%d=%d", num1, num2, (num1-num2));
}else if(b==btn3){
str=String.format("%d*%d=%d", num1, num2, (num1*num2));
}else if(b==btn4){
str=String.format("%d/%d=%d", num1, num2, (num1/num2));
}
tf3.setText(str);
} catch (Exception e2) {
tf3.setText("입력 오류!!");
}
}
}
}
마우스 이벤트 활용
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test8 extends Frame {
private static final long serialVersionUID = 1L;
private int x,y;
private Label lbl = new Label("",Label.CENTER);
public Test8(){
add(lbl,BorderLayout.SOUTH);//가운데 하단에 lbl라벨 추가
addMouseListener(new MouseHandler());//마우스가 움직였을때 감지
addMouseMotionListener(new MouseMotionHandler());
setBackground(new Color(150,150,150));//배경색 설정
setForeground(new Color(0,0,255));//글자색 설정
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setTitle("좌표출력");
setSize(400,400);
setVisible(true);
}
@Override
public void paint(Graphics g) {
String str;
str= "(" + x +"," + y +")";
g.drawString(str, x, y);//좌표출력
}
@Override
public void update(Graphics g) {//좌표 정보가 매개 변수
paint(g);//이벤트가 발생하면 paint호출
}
class MouseHandler extends MouseAdapter{//클릭, 더블클릭, 클릭후 뗄때 등의 event
@Override
public void mousePressed(MouseEvent evt) {
x = evt.getX();
y = evt.getY();
repaint();//update호출
}
}
class MouseMotionHandler extends MouseMotionAdapter{
@Override
public void mouseDragged(MouseEvent evt) {//마우스를 누른 상태로 움직일떄
x = evt.getX();
y = evt.getY();
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {//마우스가 움직일 때
String str = String.format("(%d,%d)", e.getX(), e.getY());
lbl.setText(str);
}
}
public static void main(String[] args) {
new Test8();
}
}
Swing. AWT와 80% 유사. OS에 영향을 받지 않는다.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
public class Test9 extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JLabel lbl;
public Test9(){
lbl = new JLabel("메세지",JLabel.CENTER);
getContentPane().add(lbl);
JMenuBar mbar = new JMenuBar();//메뉴바는 하나, 메뉴와 메뉴아이템은 여러개 가능
JMenu menu; //이클립스에서의 file, Edit, Source, Refactor와 같은 메뉴
JMenuItem mi; //메뉴클릭시 세부메뉴
menu = new JMenu("메세지 대화상자");//메뉴
//메세지 대화상자(menu) 클릭시 메뉴안에 세개의 아이템(MenuItem) 뜸
mi = new JMenuItem("메세지");
menu.add(mi);
mi.addActionListener(this);
mi = new JMenuItem("입력");
menu.add(mi);
mi.addActionListener(this);
mi = new JMenuItem("종료");
menu.add(mi);
mi.addActionListener(this);
mbar.add(menu);
setJMenuBar(mbar);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setTitle("대화상자");
setSize(300,300);
setVisible(true);
}
public static void main(String[] args) {
new Test9();
}
@Override
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();//클릭한 메뉴의 이름을 텍스트로 가져옴
if(str.equals("메세지")){
JOptionPane.showMessageDialog(this,"내일은 크리스마스!!","성탄절",JOptionPane.INFORMATION_MESSAGE);
//팝업 뜸. this-> 내 form위로 띄워라
}else if(str.equals("입력")){
String age = JOptionPane.showInputDialog(this,"당신의 나이는?","나이 입력",JOptionPane.QUESTION_MESSAGE);
lbl.setText("당신의 나이는 " +age +"살 이군요!");
}else if(str.equals("종료")){
int result;
result = JOptionPane.showConfirmDialog(this, "프로그램을 종료하시겠습니까?", "종료확인",
JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);//예,아니오,취소 물어봄
System.out.println(result);//예0 아니오1 취소2 -> 예 선택시 System.exit(0);
if(result==JOptionPane.YES_OPTION){//result==0과 동일
System.exit(0);
}
}
}
}
Swing을 이용한 성적 계산기 그래픽 단위로 되어있는 것은 이벤트 단위로 진행된다는 것 기억
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class Test10 extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JTextField tf[] = new JTextField[4];
private JButton btn1,btn2;
private JTable table;
public Test10(){
getContentPane().setLayout(null);
String[] title = {"이름","국어","수학","영어"};
//레이블,텍스트필드 생성
for(int i=0;i<title.length;i++){
JLabel lbl = new JLabel(title[i]);
lbl.setBounds(10, (i+1)*30, 50, 20);
getContentPane().add(lbl);
tf[i] = new JTextField();
tf[i].setBounds(80,(i+1)*30, 70, 20);
getContentPane().add(tf[i]);
}
//버튼생성
btn1 = new JButton("추가");
btn1.setBounds(10, 160, 60, 20);
btn1.addActionListener(this);
getContentPane().add(btn1);
btn2 = new JButton("종료");
btn2.setBounds(90, 160, 60, 20);
btn2.addActionListener(this);
getContentPane().add(btn2);
//JTable배치
addTable();
//종료이벤트
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//윈도우창 설정
setTitle("성적처리");
setSize(550,250);
setVisible(true);
}
//테이블배치 메소드
private void addTable(){
String title[] = {"이름","국어","수학","영어","총점","평균"};
MyTableModel model = new MyTableModel(title);
table = new JTable(model);//컬럼의 개수, 이름을 모델로 할당
//스크롤바
JScrollPane sp = new JScrollPane(table);
sp.setBounds(160,30,355,150);
getContentPane().add(sp);
//컬럼크기 자동변경 off
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//컬럼 폭 수동 지정
for(int i=0;i<title.length;i++){
TableColumn col = table.getColumnModel().getColumn(i);
col.setPreferredWidth(55);//타이틀의 갯수만큼 가져와서 간격이 55로 줄어듦
}
}
//테이블모델 클래스
class MyTableModel extends DefaultTableModel{//타이틀을 넘겨줘서 타이틀의 이름과 갯수를 반환
private static final long serialVersionUID = 1L;
private String[] title;
public MyTableModel(String[] title){
this.title = title;
}
@Override
public int getColumnCount() {//갯수반환
if(title==null||title.length==0){
return 0;
}
return title.length;
}
@Override
public String getColumnName(int column) {//컬럼의이름반환
if(title==null||title.length==0){
return null;
}
return title[column];
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
if(ob instanceof JButton){
JButton b = (JButton)ob;//downcast
if(b==btn1){
process();
}else if(b==btn2){
System.exit(0);
}
}
}
private void process(){
String[] data = new String[6];
int tot=0;
try {
data[0]=tf[0].getText(); //이름
for(int i=1;i<=3;i++){
tot+=Integer.parseInt(tf[i].getText()); //총점 누적
data[i] = tf[i].getText(); //국,영,수 점수 받아냄
}
data[4] = Integer.toString(tot); //총점
data[5] = Integer.toString(tot/3); //평균
//테이블 입력
((MyTableModel)table.getModel()).addRow(data);//downcast. JTable->MyTableModel
//초기화
for(int i=0;i<tf.length;i++){
tf[i].setText("");
}
tf[0].requestFocus();//포커스 다시 이름 텍스트 필드로 가져옴
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
new Test10();
}
}
'Dev > Java' 카테고리의 다른 글
[java] xml파일 읽어오기, 정규화표현식 (0) | 2019.01.31 |
---|---|
[java] 채팅프로그램 만들기 (0) | 2019.01.31 |
[java] 객체의 직렬화, 역직렬화 (0) | 2019.01.31 |
[java] Stream (0) | 2019.01.30 |
[java] 스레드 (0) | 2019.01.28 |