Dev/Java

[java] 윈도우,swing

창문닦이 2019. 1. 31. 13:45

프로토콜. 통신규약 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