[자바기초] 쓰레드와 JPanel을 활용한 몬스터 피하기

thread_monster.zip package com.ljh; import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MonsterGameFrame extends JFrame { // 아바타로 사용할 문자열은 "@", 괴물로 사용할 문자열은 "M", 종료키는 'q', 괴물은 200ms 주기로 움직인다 private JPanel gamePanel = new GamePanel("@", "M", 'q', 200); // 게임 패널, 컨텐트팬으로 사용한다. public MonsterGameFrame() { setTitle("Open Challenge 13"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setContentPane(gamePanel); // GamePanel을 컨텐트팬으로 사용한다. setSize(300,300); setVisible(true); gamePanel.setFocusable(true); gamePanel.requestFocus(); // GamePanel이 키를 입력받을 수 있도록 포커스를 설정한다. } // 게임이 진행되는 패널. 배치관리자를 null로 설정 class GamePanel extends JPanel { private String avatarChar; private String monsterChar; private char quitChar; private long monsterDelay; private JLabel avatar;// 아바타를 위한 레이블 private JLabel monster; // 괴물을 위한 레이블 final int AVATAR_MOVE = 10; // 아바타가 한번에 움직이는...

[자바기초] 쓰레드를 활용한 교차 출력

thread_test.zip ThreadMain package MyTread; public class MyTread { public static void main(String[] args) { Cnt cnt = new Cnt(); new PrintThread(cnt).start(); new UpThread(cnt).start(); } } Cnt package MyTread; public class Cnt { /* * 두 스레드가 공유하는 클래스 */ public final static int MAX = 100; private int cnt = 0; // wait(), notify()를 사용하기 위해서는 synchronized가 적용된 메소드만 가능 // cnt가 30일 때 wait(); public synchronized void doWait() { if (cnt == 30) { try { System.out.println("wait()"); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } // cnt가 60일 때 notify(); public synchronized void doNotify() { if (cnt == 60) { notify(); System.out.println("notify()"); } } @Override public String toString() { ...

[자바기초] 소켓을 활용한 두개의 컴퓨터로 채팅 기능 구현

socket_test.zip package com.ljh.chat; import java.io.*; import java.net.*; import java.util.*; public class ClientEx { public static void main(String[] args) { BufferedReader in = null; BufferedWriter out = null; Socket socket = null; Scanner scanner = new Scanner(System.in); // 키보드에서 읽을 scanner 객체 생성 try { socket = new Socket("localhost", 9999); // 클라이언트 소켓 생성. 서버와 바로 연결 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 소켓 입력 스트림 out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 소켓 출력 스트림 while (true) { System.out.print("보내기>>"); // 프롬프트 String outputMessage = scanner.nextLine(); // 키보드에서 한 행 읽기 if (outputMessage.equalsIgnoreCase("bye")) { out.write(outputMessage+"\n"); // "bye" 문자열 전송 out.flush(); break; // 사용자가 "bye"를 입력한 경우 서버로 전송 후 연결 종료 } out.write(outputMessage + "\n"); // 키보드에서 읽은 문자열 전...

[자바기초] 스윙을 활용한 로그인 화면

login_swing.zip package com.ljh.layout; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import com.ljh.account.AccountClass; //제목정하기, 전체구조(레이아웃), 컨테이너생성 public class LayoutClass extends JFrame { JTextField jt1; JPasswordField jt2; int logCount = 3; public LayoutClass() { setTitle("로그인화면"); // 프레임의 타이틀 달기 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 프레임 윈도우를 닫으면 프로그램 종료 BorderLayout bLayout = new BorderLayout(50, 20); //전체구조 Container c = getContentPane(); c.setLayout(bLayout); //setResizable(false); // 사이즈 조절 막아버림 ㅋㅋ JPanel northPanel = new JPanel(); JPanel centerPanel = new JPanel(); JPanel southP...

[자바기초] ArrayList를 통한 미니 학사관리 시스템

DB 없이 ArrayList로 값을 전달했던 예전을 추억하며.. ㅎ learning_management_system.zip package com.ljh.lms.data; import java.util.ArrayList; import com.ljh.lms.obj.CourseClass; public class CourseDataClass { public ArrayList<CourseClass> courseArrayList=new ArrayList<CourseClass>(); public CourseDataClass(){ courseArrayList.add(new CourseClass("C101", "전산개론", 3)); courseArrayList.add(new CourseClass("C102", "자료구조", 3)); courseArrayList.add(new CourseClass("C103", "데이터베이스", 4)); courseArrayList.add(new CourseClass("C301", "운영체제", 3)); courseArrayList.add(new CourseClass("C302", "컴퓨터구조", 3)); courseArrayList.add(new CourseClass("C303", "이산수학", 4)); courseArrayList.add(new CourseClass("C304", "객체지향언어", 4)); courseArrayList.add(new CourseClass("C501", "인공지능", 3)); courseArrayList.add(new CourseClass("C502",...

[자바기초] JDBC와 JTable을 이용한 미니 BBS 게시판

jdbc_jtable_bbs.zip package com.ljh; import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class JTable_dynamic_data extends JFrame { private Container con; private String[] str = {"1번", "2번", "3번", "4번"}; //JTable의 header에 출력되는 문자열 배열 //DefaultTableModel은 JTable의 기본 형태를 제공하는 클래스 //이 클래스의 생성자에는 (header, 행의 갯수); private DefaultTableModel dtm = new DefaultTableModel(str, 5); //설정이 완료된 DefaultTableMode 객체를 JTable의 생성자에게 전달.... private JTable jt = new JTable(dtm); //JScrollPane은 스크롤 기능을 제공하는 클래스... //JScrollPane의 생성자 스크롤 기능을 부여할 객체를 전달... private JScrollPane jsp = new JScrollPane(jt); public JTable_dynamic_data() { super("Test"); con = getContentPane(); con.setLayout(new BorderLayout(5,5)); con.add("Center", jsp); this.setSize(300, 200); this.s...

[자바기초] mySQL 기본문법적용 및 한글인코딩(Driver load, Connection, Statement)

자바<->MySQL 사이에 한글을 입력할때 깨짐현상을 방지하기 위한 인코딩이 필요할때가 있다. 인코딩 메소드를 통해 ISO-8859-1 방식으로 지정하여 한글깨짐을 방지해야 한다. jdbc_db_test.zip ChangeEncoding package com.ljh; import java.io.UnsupportedEncodingException; public class ChangeEncoding { // java => mySQL public static String toLatin(String str){ try{ byte[] b=str.getBytes(); return new String(b, "ISO-8859-1"); }catch(UnsupportedEncodingException uee){ System.out.println("Encoding ERR : " +uee.getMessage()); return null; } } // mySQL => Java public static String toUnicode(String str){ try{ byte[] b=str.getBytes("ISO-8859-1"); return new String(b); }catch(UnsupportedEncodingException uee){ System.out.println("Encoding ERR : " +uee.getMessage()); return null; } } } MainClass package com.ljh; import java.sql.Connection; import java.sql.Drive...