JTree 자바 트리

JTree 자바 트리

제이트리(JTree, jtree)

package fixForm;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class FixForm {

 public static void main(String[] args) {
  JFrame frame = new JFrame(“제이트리”);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  DefaultMutableTreeNode root = new DefaultMutableTreeNode(“Root”);
  DefaultMutableTreeNode tree1 = new DefaultMutableTreeNode(“Tree1”);
  root.add(tree1);
  DefaultMutableTreeNode tree2 = new DefaultMutableTreeNode(“Tree2”);
  tree1.add(tree2);
  
  JTree tree = new JTree(root);
  
  frame.add(tree);
  frame.setSize(300, 150);
  frame.setVisible(true);
 }

 
 
}

public FixForm(){
  int form_width = 800;
  int form_height = 500;
  int font_size = 13;
  
  Font font = new Font(“굴림”, 10, font_size);
  
  //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  DefaultMutableTreeNode root = new DefaultMutableTreeNode(“Root”);
  DefaultMutableTreeNode tree1 = new DefaultMutableTreeNode(“Tree1”);
  root.add(tree1);
  DefaultMutableTreeNode tree2 = new DefaultMutableTreeNode(“Tree2”);
  tree1.add(tree2);
  
  JTree tree = new JTree(root);
  
  JScrollPane jscroll = new JScrollPane(tree);
  jscroll.setSize(300, form_height);
  jscroll.setVisible(true);
  
  getContentPane().add(jscroll);
  
  // 폼 크기 설정 등
  setTitle(“타이틀”);
  getContentPane().setLayout(null);
  setSize(form_width, form_height);
  
  setVisible(true);
 }
 

jsp 유사ajax

jsp 유사ajax

url.openStream()을 사용해 유사ajax 를 만드는 소스.

http://나의 도메인 이름/njax.jsp?url_string=http://google.com 식으로 접근.

ajax 는 ‘비동기 자바스크립트 and XML’의 약자인데 아래 소스는 ‘동기 자바스크립트 and XML’이라 할 수 있다.

out.print 로 화면에 그대로 뿌리면 그 자체로 xml이 된다.

njax.jsp 

<%@ page language=”java” contentType=”text/xml;charset=utf-8″ %>
<%@ page import=”java.io.*” %>
<%@ page import=”java.net.*” %>

<%
    request.setCharacterEncoding(“UTF-8”);
    response.setContentType(“text/xml”);

    BufferedReader reader;
    URL url;
   
    String pre_openAPI = (String) request.getParameter(“url_string”);
   
    if(pre_openAPI == null || pre_openAPI.trim().equals(“”)){
     pre_openAPI = “”;
    }
    String openAPI = new String (pre_openAPI.getBytes(“utf-8”), “utf-8”);

    try{
        url = new URL( openAPI );
        reader = new BufferedReader(new InputStreamReader(url.openStream()));
        //reader = new BufferedReader(new InputStreamReader(url.openStream(), “EUC-KR”));

        String iline = “”;
  
        while ((iline = reader.readLine()) != null){
            out.print(iline);
        }
        reader.close();

  }catch(Exception ex){System.out.println(ex.getMessage());}
%>

인코딩은 reader = new BufferedReader(new InputStreamReader(url.openStream(), “EUC-KR”)); 로 하거나, 적절히 값을 바꿔주면 된다. 만약 상대방이 넘겨주는게 xml 이 아니라고 하면,

그냥 jsp 안에 이 소스를 넣고 iline을 읽어들이는대로 +해서 한 개의 스트링으로 붙여놓고 원하는 값을 파싱한 후 뿌려주면 된다.

자바스크립트 달력

자바스크립트 달력

누가 만든 것에다가 요일 가져오는 것만 추가함. (getTodayYoil)

calendar.js

var fixedX = -1; ////////// 레이어 X축 위치 (-1 : 버튼에 바로 아래에 표시)
var fixedY = -1; ////////////// 레이어 Y축 위치 (-1 : 버튼에 바로 아래에 표시)
var startAt = 0; ///////////// 일요일 표시 부분 / 0 : 일요일(일월화…) / 1 : 월요일(…금토일)
var showToday = 1; // 오늘 날자 표시 유무 – 0 : 감춤 / 1 : 보임
var imgDir = ‘./’; // 이미지 디렉토리 – ./ : 현재 디렉토리

/////////////////////////////// 각 변수 선언 ///////////////////
var crossobj, crossMonthObj, crossYearObj, monthSelected, yearSelected, dateSelected, omonthSelected, oyearSelected, odateSelected, monthConstructed, yearConstructed, intervalID1, intervalID2, timeoutID1, timeoutID2, ctlToPlaceValue, ctlNow, dateFormat, nStartingMonth, nStartingYear

var bPageLoaded = false;
var ie = document.all;
var dom = document.getElementById;
var bShow = false;
var ns4 = document.layers;

var today = new Date(); /////////////// 날자 변수 선언
var dateNow = today.getDate(); //////////////// 로컬 컴퓨터의 일(day)을 구함 
var monthNow = today.getMonth(); ///////////////// 로컬 컴퓨터의 월(month)을 구함
var yearNow = today.getYear(); ///////////////// 로컬 컴퓨터의 년(year)을 구함

var monthName = new Array(“1월”, “2월”, “3월”, “4월”, “5월”, “6월”, “7월”, “8월”, “9월”, “10월”, “11월”, “12월”)
var monthName2 = new Array(“1월”, “2월”, “3월”, “4월”, “5월”, “6월”, “7월”, “8월”, “9월”, “10월”, “11월”, “12월”)

if (startAt==0) {
 dayName = new Array (“일”,”월”,”화”,”수”,”목”,”금”,”토”)
} else {
 dayName = new Array (“월”,”화”,”수”,”목”,”금”,”토”,”일”)
}
var oPopup = window.createPopup();
var oPopBody = oPopup.document.body;
var strCalendar;
var cleft;
var ctop;

if(dom) {
 strCalendar = “<img src=” width=0 height=0>”;
 strCalendar += “<style type=’text/css’>”;
 strCalendar += “td {font-size:12px; font-family:굴림; text-decoration:none; }”;
 strCalendar += “A:link,A:active,A:visited{text-decoration:none;font-size:12PX;color:#333333;}”;
 strCalendar += “A:hover {text-decoration:none; color:ff9900}”;
 strCalendar += “font { font-size: 9pt; }”;
 strCalendar += “.cnj_close {font-size:8pt;color:#000000; background-color:#EFEFEF; border-width:1; border-color:#808080; border-style:solid;cursor:hand;font-weight:bold;height:16px;width:16px;text-align:center;vertical-align:bottom}”;
 strCalendar += “.cnj_close2 {font-size:8pt;color:#ff0000; background-color:#EFEFEF; border-width:1; border-color:#808080; border-style:solid;cursor:hand;font-weight:bold;height:16px;width:16px;text-align:center;vertical-align:bottom}”;
 strCalendar += “.cnj_input {background-color:rgb(240,240,240);border-width:1pt; height:16pt;cursor:hand;}”;
 strCalendar += “.cnj_input2 {font-size:8pt;color:#808080; background-color:#EFEFEF; border-width:1; border-color:#808080; border-style:solid;cursor:hand;height:16px;}”;
 strCalendar += “.cnj_input3 {font-size:8pt;color:#000000; background-color:#FFFFFF; border-width:1; border-color:#C00000; border-style:solid;cursor:hand;height:16px;}”;
 strCalendar += “.cnj_input4 {font-size:8pt;color:#C00000; background-color:#FFFFFF; border-width:1; border-color:#808080; border-style:solid;cursor:hand;height:16px;}”;
 strCalendar += “.cnj_td {border-width:1;border-style:solid;border-color:#a0a0a0;}”;
 strCalendar += “</style>”;

 strCalendar += “<div id=’calendar’ style=’z-index:+999;position:absolute;;’>”;
 strCalendar += “<table width=’190′ class=’cnj_td’>”;
 strCalendar += ” <tr bgcolor=’#EEEEEE’ height=20>”;
 strCalendar += ”  <td>”;
 strCalendar += ”   <table width=’188′ border=0>”;
 strCalendar += ”    <tr height=20>”;
 strCalendar += ”     <td style=’padding:0px;’><font color=’#ffffff’><B><span id=’caption’></span></B></font></td>”;
 strCalendar += ”     <td align=right><input type=’button’ value=’x’ class=’cnj_close’ title=’닫기’ onclick=’parent.oPopup.hide()’ onfocus=’this.blur()’ onMouseover=\”this.className=’cnj_close2’\” onMouseout=\”this.className=’cnj_close’\”></td>”;
 strCalendar += ”    </tr>”;
 strCalendar += ”   </table>”;
 strCalendar += ”  </td>”;
 strCalendar += ” </tr>”;
 strCalendar += ” <tr height=1>”;
 strCalendar += ”  <td style=’padding:3px’ bgcolor=#ffffff><span id=’content’></span></td>”;
 strCalendar += ” </tr>”;
   
 if(showToday==1) {
  strCalendar += “<tr bgcolor=#f0f0f0 height=20><td style=’padding:5px’ align=center><span id=’lblToday’></span></td></tr>”;
 }
   
 strCalendar += “</table>”;
 strCalendar += “</div>”;
 strCalendar += “<div id=’selectMonth’ style=’z-index:+999;position:absolute;display:none;’></div> “;
 strCalendar += “<div id=’selectYear’ style=’z-index:+999;position:absolute;display:none;’></div>”;
 oPopBody.innerHTML = strCalendar;
}

function init() {
 if(!ns4) {
  if(!ie) {
   yearNow += 1900;
  }

  crossobj = oPopBody.all.calendar;
  crossMonthObj = oPopBody.all.selectMonth;
  crossYearObj = oPopBody.all.selectYear;
  monthConstructed = false;
  yearConstructed = false;

  sHTML1=”<input type=’button’ value=’◀’ class=’cnj_input2′ onClick=’javascript:parent.movedecMonth()’ onfocus=’this.blur()’ title=’이전 달로 이동’ ”
  sHTML1+=”onMouseover=\”this.className=’cnj_input3′;window.status=’이전 달로 이동’\” onMouseout=\”this.className=’cnj_input2′;window.status=”\”> </span> “

  sHTML1+=”<input type=’button’ value=’▶’  class=’cnj_input2′ onClick=’javascript:parent.moveincMonth()’ onfocus=’this.blur()’ title=’다음 달로 이동’ ”
  sHTML1+=”onMouseover=\”this.className=’cnj_input3′;window.status=’다음 달로 이동’\”  onMouseout=\”this.className=’cnj_input2′;window.status=”\”> </span> “

  sHTML1+=”<span id=’spanYear’  class=’cnj_input4′ onclick=’parent.popUpYear()’ title=’년도 선택’ “
  sHTML1+=”onMouseover=\”this.className=’cnj_input3′;window.status=’년도 선택’\” onMouseout=\”this.className=’cnj_input4′;window.status=”\”></span> “;

  sHTML1+=”<span id=’spanMonth’  class=’cnj_input4′ onclick=’parent.popUpMonth()’ title=’월 선택’ “
  sHTML1+=”onMouseover=\”this.className=’cnj_input3′;window.status=’월 선택’\” onMouseout=\”this.className=’cnj_input4′;window.status=”\”></span>&nbsp;”;

  
  oPopup.document.getElementById(“caption”).innerHTML = sHTML1;
  bPageLoaded = true;
  
  if(showToday==1) {
   oPopup.document.getElementById(“lblToday”).innerHTML = “”+
   “<div onmousemove=’window.status=\”오늘 날짜\”‘ onmouseout=’window.status=\”\”‘ title=’오늘 날짜’ “+
   //” style='”+styleAnchor+”‘ href=’javascript:monthSelected=monthNow;yearSelected=yearNow;constructCalendar();’ onFocus=’this.blur()’>”+
   ” style='”+styleAnchor+”‘ onclick=parent.totoday() onFocus=’this.blur()’>”+
   “오늘 날짜 :  “+yearNow+”년 “+
   “”+monthName[monthNow].substring(0,3)+” “+
   “”+dateNow+”일 “+  // 일
   “</div>”;
  }  
 }
}

function totoday(){ // 오늘 날짜로 표시하기
 monthSelected=monthNow;
 yearSelected=yearNow;
 constructCalendar();
}

function HolidayRec(d, m, y, desc) {
 this.d = d;
 this.m = m;
 this.y = y;
 this.desc = desc;
}

var HolidaysCounter = 0;
var Holidays = new Array();

function addHoliday(d, m, y, desc) {
 Holidays[HolidaysCounter++] = new HolidayRec ( d, m, y, desc );
}

var styleAnchor = “text-decoration:none;color:black;cursor:hand;width:100%;height:100%”;
var styleLightBorder = “border-style:solid;border-width:1px;border-color:#a0a0a0;text-decoration:underline;font-weight:bold;cursor:hand;width:100%;height:100%”;

function padZero(num) {
 return (num < 10)? ‘0’ + num : num;
}

function getTodayYoil(year, month, day){
 var yoil = Array (‘일’,’월’,’화’,’수’,’목’,’금’,’토’);
 var month_day = Array (31,28,31,30,31,30,31,31,30,31,30,31);
  
 if((year%4==0 && year%100==0) || year%400==0){
  month_day[1] = 29; //올해가 윤년일 경우 29일로 고치기
 }
 //작년까지의 일수를 모두 더함(년->일수로 변환)
 var lastYear = parseInt((year-1)*365) + parseInt((year-1)/4) – parseInt((year-1)/100) + parseInt((year-1)/400);

 var lastMonth=0;
 //저번달까지의 일수를 모두 더함(월->일수로 변환)
 for(var i=0; i < month – 1; i++){
 lastMonth += month_day[i];
 }
 
 //오늘까지의 일수를 모두 계산하기
 var total = lastYear + lastMonth + day;
 var todayYoil = yoil[total%7];
 
 return todayYoil;
}

function constructDate(d,m,y) {
 
 sTmp = dateFormat
 sTmp = sTmp.replace(“dd”,”<e>”);
 sTmp = sTmp.replace(“d”,”<d>”);
 sTmp = sTmp.replace(“<e>”,padZero(d));
 sTmp = sTmp.replace(“<d>”,d);
 sTmp = sTmp.replace(“mmmm”,”<p>”);
 sTmp = sTmp.replace(“mmm”,”<o>”);
 sTmp = sTmp.replace(“mm”,”<n>”);
 sTmp = sTmp.replace(“m”,”<m>”);
 sTmp = sTmp.replace(“<m>”,m+1);
 sTmp = sTmp.replace(“<n>”,padZero(m+1));
 sTmp = sTmp.replace(“<o>”,monthName[m]);
 sTmp = sTmp.replace(“<p>”,monthName2[m]);
 sTmp = sTmp.replace(“yyyy”,y);
 var yoil = getTodayYoil(y,m+1,d);
 sTmp = sTmp.replace(“yoil”, yoil);

 return sTmp.replace(“yy”,padZero(y%100));
}

function closeCalendar() {
 oPopup.hide();
 ctlToPlaceValue.value = constructDate(dateSelected,monthSelected,yearSelected);
}

function moveincMonth() {
 monthSelected++;

 if (monthSelected>11) {
  monthSelected=0;
  yearSelected++;
 }
 constructCalendar();
}

function movedecMonth() {
 monthSelected–;

 if (monthSelected<0) {
  monthSelected=11;
  yearSelected–;
 }
 constructCalendar();
}

function incMonth() {
 if (nStartingMonth + 6 == 12) return;
 for(i = 0; i < 7; i++) {
  newMonth = (i + nStartingMonth) + 1;

  if (newMonth > 12) {nStartingMonth–; break;}
  if (newMonth == monthSelected + 1) {
   txtMonth = ” <b>”+ newMonth +”월</b> “;
  } else {
   txtMonth = ” ” + newMonth + “월”;
  }
  oPopup.document.getElementById(“m”+i).innerHTML = txtMonth;
 }
 nStartingMonth++;
 bShow = true;
}

function decMonth() {
 if (nStartingMonth == 1) return;
 for (i=0; i<7; i++) {
  newMonth = (i+nStartingMonth)-1;

  if (newMonth < 1) {nStartingMonth++; break;}
  if (newMonth==monthSelected + 1) {
   txtMonth = ” <b>”+ newMonth +”월</b> “;
  } else {
   txtMonth = ” ” + newMonth + “월”;
  }
  oPopup.document.getElementById(“m”+i).innerHTML = txtMonth;
 }
 nStartingMonth–;
 bShow = true;
}

function selectMonth(nMonth) {
 monthSelected = parseInt(nMonth + nStartingMonth – 1);
 monthConstructed = false;
 constructCalendar();
 popDownMonth();
}

function constructMonth() {
 popDownYear();
 sHTML = “”;

 if(!monthConstructed) { // 월 이전 월 링크
  sHTML =”<tr><td align=’center’ style=’cursor:pointer’  “
  sHTML +=” onmouseover=’this.style.backgroundColor=\”#FFCC99\”‘ “
  sHTML +=” onmouseout=’clearInterval(parent.intervalID1);this.style.backgroundColor=\”\”‘  “
  sHTML +=” onmousedown=’clearInterval(parent.intervalID1);parent.intervalID1=setInterval(\”parent.decMonth()\”,30)’ “
  sHTML +=” onmouseup=’clearInterval(parent.intervalID1)’> “
  sHTML +=” ▲</td></tr>”;
  j = 0;
  
  var nSelectedMonth = monthSelected + 1;
  
  nStartingMonth = (nSelectedMonth – 3) < 1 ? 1 : nSelectedMonth – 3; //시작월 – 3 이 1보다 작으면 1로 고정
  nStartingMonth = nStartingMonth > 6 ? 6 : nStartingMonth; //시작월이 6보다 크면 6로 고정 (6 시작 월 + 목록 숫자 6 = 12 종료 월)

  var nEndMonth = (nSelectedMonth + 3) > 12 ? 12 : (nSelectedMonth + 3); // 종료월 + 3이 12보다 크면 12로 고정
  nEndMonth = nEndMonth < 7 ? 7 : nEndMonth; //종료 월이 7보다 작으면 7로 고정
  
  for (i = nStartingMonth; i <= nEndMonth; i++) {
   sName = i;

   //////////////// 현재 월 ////////////////////////
   if (i == nSelectedMonth) { sName = “<b>” + sName + “</b>” }
   sHTML +=”<tr><td height=’15’ id=’m” + j + “‘ onmouseover=’this.style.backgroundColor=\”#FFCC99\”‘ onmouseout=’this.style.backgroundColor=\”\”‘ “
   sHTML +=” style=’cursor:pointer’ onClick=’parent.selectMonth(“+j+”);event.cancelBubble=true’> ” + sName + “월”
   sHTML +=”</td></tr>”;
   j ++;
  }
       
   // 월 다음 월 링크
  sHTML += “<tr><td align=’center’ onmouseover=’this.style.backgroundColor=\”#FFCC99\”‘ style=’cursor:pointer’ “
  sHTML += ” onmouseout=’clearInterval(parent.intervalID2);this.style.backgroundColor=\”\”‘ “
  sHTML += ” onmousedown=’clearInterval(parent.intervalID2);parent.intervalID2=setInterval(\”parent.incMonth()\”,30)’ “
  sHTML += ” onmouseup=’clearInterval(parent.intervalID2)’> “
  sHTML += ” ▼</td></tr>”;

          /////// 월 표 크기 ///////////////////////////////
  oPopup.document.getElementById(“selectMonth”).innerHTML = “”+
  “<table width=’50’ style=’font-family:굴림; font-size:11px; border-width:1; border-style:solid; border-color:#a0a0a0;’ bgcolor=’#FFFFDD’ “+
  ” onmouseover=’clearTimeout(parent.timeoutID2)’ “+
  ” onmouseout=’clearTimeout(parent.timeoutID2);parent.timeoutID2=setTimeout(\”parent.popDownMonth()\”,100)’ cellspacing=0>”+
  “”+ sHTML + “”+
  “</table>”;
  monthConstructed = true;
 }
}

function popUpMonth() {
 constructMonth();
 crossMonthObj.style.display = “”;
 crossMonthObj.style.left = crossobj.style.left + 50;
 crossMonthObj.style.top = crossobj.style.top + 26;
}

function popDownMonth() {
 crossMonthObj.style.display = “none”;
}

function incYear() {
 for(i=0; i<7; i++) {
  newYear = (i+nStartingYear)+1;

  if (newYear==yearSelected) {
   txtYear = ” <B>”+ newYear +”년  </B> “;
  } else {
   txtYear = ” ” + newYear + “년  “;
  }
  oPopup.document.getElementById(“y”+i).innerHTML = txtYear;
 }
 nStartingYear++;
 bShow = true;
}

function decYear() {
 for (i=0; i<7; i++) {
  newYear = (i+nStartingYear)-1;

  if (newYear==yearSelected) {
   txtYear = ” <b>”+ newYear +”년  </b> “;
  } else {
   txtYear = ” ” + newYear + “년  “;
  }
  oPopup.document.getElementById(“y”+i).innerHTML = txtYear;
 }
 nStartingYear–;
 bShow = true;
}

function selectYear(nYear) {
 yearSelected = parseInt(nYear+nStartingYear);
 yearConstructed = false;
 constructCalendar();
 popDownYear();
}

function constructYear() {
 popDownMonth();
 sHTML = “”;

 if(!yearConstructed) { // 년도 이전 년도 링크
  sHTML =”<tr><td align=’center’ style=’cursor:pointer’  “
  sHTML +=” onmouseover=’this.style.backgroundColor=\”#FFCC99\”‘ “
  sHTML +=” onmouseout=’clearInterval(parent.intervalID1);this.style.backgroundColor=\”\”‘  “
  sHTML +=” onmousedown=’clearInterval(parent.intervalID1);parent.intervalID1=setInterval(\”parent.decYear()\”,30)’ “
  sHTML +=” onmouseup=’clearInterval(parent.intervalID1)’> “
  sHTML +=” ▲</td></tr>”;
  j = 0;
  nStartingYear = yearSelected-3;

  for (i=(yearSelected-3); i<=(yearSelected+3); i++) {
   sName = i;

   if (i==yearSelected) { sName = “<b>” + sName + “</b>” }
   sHTML +=”<tr><td height=’15’ id=’y” + j + “‘ onmouseover=’this.style.backgroundColor=\”#FFCC99\”‘ onmouseout=’this.style.backgroundColor=\”\”‘ “
   sHTML +=” style=’cursor:pointer’ onClick=’parent.selectYear(“+j+”);event.cancelBubble=true’> ” + sName + “년  “
   sHTML +=”</td></tr>”;
   j ++;
  }
       
   // 년도 다음 년도 링크
  sHTML += “<tr><td align=’center’ onmouseover=’this.style.backgroundColor=\”#FFCC99\”‘ style=’cursor:pointer’ “
  sHTML += ” onmouseout=’clearInterval(parent.intervalID2);this.style.backgroundColor=\”\”‘ “
  sHTML += ” onmousedown=’clearInterval(parent.intervalID2);parent.intervalID2=setInterval(\”parent.incYear()\”,30)’ “
  sHTML += ” onmouseup=’clearInterval(parent.intervalID2)’> “
  sHTML += ” ▼</td></tr>”;

         /////// 년도 표 크기 ///////////////////////////////
  oPopup.document.getElementById(“selectYear”).innerHTML = “”+
  “<table width=’55’ style=’font-family:굴림; font-size:11px; border-width:1; border-style:solid; border-color:#a0a0a0;’ bgcolor=’#FFFFDD’ “+
  ” onmouseover=’clearTimeout(parent.timeoutID2)’ “+
  ” onmouseout=’clearTimeout(parent.timeoutID2);parent.timeoutID2=setTimeout(\”parent.popDownYear()\”,100)’ cellspacing=0>”+
  “”+ sHTML + “”+
  “</table>”;
  yearConstructed = true;
 }
}

function popDownYear() {
 clearInterval(intervalID1);
 clearTimeout(timeoutID1);
 clearInterval(intervalID2);
 clearTimeout(timeoutID2);
 crossYearObj.style.display = “none”;
}

function popUpYear() {
 constructYear();
 crossYearObj.style.display = “”;
 crossYearObj.style.left = crossobj.style.left + (6 + oPopup.document.getElementById(“spanYear”).offsetLeft) + “px”;
 crossYearObj.style.top = crossobj.style.top + 26;
}

function constructCalendar() {
 var aNumDays = Array (31,0,31,30,31,30,31,31,30,31,30,31);
 var dateMessage;
 var startDate = new Date (yearSelected,monthSelected,1);
 var endDate;
 var intWeekCount = 1;
 
 if(monthSelected==1) {
  endDate = new Date (yearSelected,monthSelected+1,1);
  endDate = new Date (endDate – (24*60*60*1000));
  numDaysInMonth = endDate.getDate();
 } else {
  numDaysInMonth = aNumDays[monthSelected];
 }

 datePointer = 0;
 dayPointer = startDate.getDay() – startAt;
  
 if(dayPointer<0) {
  dayPointer = 6;
 }
 sHTML = “<table  border=0 style=’font-family:verdana;font-size:10px;’><tr height=16>”;

 for(i=0; i<7; i++) {   /////// 요일 ///////////////////////
  if(i == 0) {
   sHTML += “<td width=’27’ align=’right’><b><font color=red>”+ dayName[i]+”</font></b></td>”;
  } else if(i == 6) {
   sHTML += “<td width=’27’ align=’right’><b><font color=blue>”+ dayName[i]+”</font></b></td>”;
  } else {
   sHTML += “<td width=’27’ align=’right’><b>”+ dayName[i]+”</b></td>”;
  }
 }
 sHTML +=”</tr><tr height=16>”;
  
 for(var i=1; i<=dayPointer;i++) {  // 빈 날짜
  sHTML += “<td> </td>”;
 }
 
 for(datePointer=1; datePointer<=numDaysInMonth; datePointer++) {
  dayPointer++;
  sHTML += “<td align=right>”;
  sStyle = styleAnchor;

  if((datePointer==odateSelected) && (monthSelected==omonthSelected) && (yearSelected==oyearSelected)) {
   sStyle += styleLightBorder;
  }
  sHint = “”;

  for(k=0;k<HolidaysCounter;k++) {
   if((parseInt(Holidays[k].d)==datePointer)&&(parseInt(Holidays[k].m)==(monthSelected+1))) {
    if((parseInt(Holidays[k].y)==0)||((parseInt(Holidays[k].y)==yearSelected)&&(parseInt(Holidays[k].y)!=0))) {
     sStyle+=”background-color:#FFDDDD;”;
     sHint+=sHint==””?Holidays[k].desc:”\n”+Holidays[k].desc;
    }
   }
  }
  var regexp= /\”/g;
  sHint=sHint.replace(regexp,”&quot;”);
  /////////////// 날짜 선택시 ==> 마우스가 날짜 위로 갔을때 ///////////////////////////////
  dateMessage = “title=’ 날짜 선택 : “+ yearSelected + “년 ” + monthName[monthSelected] +” ”  + datePointer + “일”+”‘ onmousemove=’window.status=\” 날짜 선택 : “+ yearSelected + “년 ” + monthName[monthSelected] +” ”  + datePointer + “일”+”\”‘ onmouseout=’window.status=\”\”‘ “;

  if((datePointer == dateNow) && (monthSelected == monthNow) && (yearSelected == yearNow)) {  // 현재 오늘 날짜
   sHTML += “<b><div style='”+sStyle+”‘ onclick=’javascript:parent.dateSelected=”+datePointer+”;parent.closeCalendar();’><font color=#00C000> ” + datePointer + “</font> </div></b>”;
  } else
  //if((dayPointer % 7 == (startAt * -1)+1) || (dayPointer % 7 == (startAt * -1))) {  // 일요일, 토요일
  if(dayPointer % 7 == ((startAt * -1)+1)) {  // 일요일
   sHTML += “<div style='”+sStyle+”‘ onclick=’javascript:parent.dateSelected=”+datePointer + “;parent.closeCalendar();’> <font color=red>” + datePointer + “</font> </div>”;
  } else if(dayPointer % 7 == (startAt * -1)) { // 토요일
   sHTML += “<div style='”+sStyle+”‘ onclick=’javascript:parent.dateSelected=”+datePointer + “;parent.closeCalendar();’> <font color=blue>” + datePointer + “</font> </div>”;
  } else {
   sHTML += “<div style='”+sStyle+”‘ onclick=’javascript:parent.dateSelected=”+ datePointer + “;parent.closeCalendar();’>” + datePointer + “</div>”;
  }
  sHTML += “”;

  if((dayPointer+startAt) % 7 == startAt) {
   sHTML += “</tr><tr height=16>”;
   intWeekCount ++;
  }
 }
 sHTML += “</tr>”;
 sHTML = sHTML.replace(“<tr height=16></tr>”, “”);
 if (((dayPointer+startAt) % 7) == 0) intWeekCount–;
 oPopup.document.getElementById(“content”).innerHTML = sHTML; 

 ////////셀릭트 월 선택
 oPopup.document.getElementById(“spanMonth”).innerHTML = ” ” + monthName[monthSelected] + ” <input type=’button’  id=’changeMonth’value=’▼’  class=’cnj_input2′ onfocus=’this.blur()’ onMouseover=\”this.className=’cnj_input3’\” onMouseout=\”this.className=’cnj_input2’\”>”

 //////// 셀릭트 년도 선택
 oPopup.document.getElementById(“spanYear”).innerHTML = ” ” + yearSelected + “년 <input type=’button’  id=’changeYear” value=’▼’  class=’cnj_input2′ onfocus=’this.blur()’ onMouseover=\”this.className=’cnj_input3’\” onMouseout=\”this.className=’cnj_input2’\”>”
 
 
 //alert(intWeekCount);
 var popHeight;
 if (intWeekCount == 6)
  popHeight = 195;
 else
  popHeight = 177;
 oPopup.show(cleft, ctop, 198, popHeight, document.body);
}

function popUpCalendar(ctl, ctl2, format) {
 var leftpos = 0;
 var toppos = 0;

 if(bPageLoaded) {
  ctlToPlaceValue = ctl2;
  dateFormat=format;
  formatChar = ” “;
  aFormat = dateFormat.split(formatChar);

   if(aFormat.length<3) {
    formatChar = “/”;
    aFormat = dateFormat.split(formatChar);

    if(aFormat.length<3) {
     formatChar = “.”;
     aFormat = dateFormat.split(formatChar);

     if(aFormat.length<3) {
      formatChar = “-“;
      aFormat = dateFormat.split(formatChar);

      if (aFormat.length<3) {
       formatChar=””;
      }
     }
    }
   }
   tokensChanged = ‘0’;

   if(formatChar != “”) {
    aData = ctl2.value.split(formatChar);

    for(i=0;i<3;i++) {
     if ((aFormat[i]==”d”) || (aFormat[i]==”dd”)) {
      dateSelected = parseInt(aData[i], 10);
      tokensChanged++;
     } else
     if((aFormat[i]==”m”) || (aFormat[i]==”mm”)) {
      monthSelected = parseInt(aData[i], 10) – 1;
      tokensChanged++;
     } else
     if(aFormat[i]==”yyyy”) {
      yearSelected = parseInt(aData[i], 10);
      tokensChanged++;
     }else
     if(aFormat[i]==”mmm”) {

      for(j=0; j<12; j++) {
       if (aData[i]==monthName[j]) {
        monthSelected=j;
        tokensChanged++;
       }
      }
     } else
     if(aFormat[i]==”mmmm”) {
      for(j=0; j<12; j++) {
       if (aData[i]==monthName2[j]) {
        monthSelected=j;
        tokensChanged ++;
       }
      }
     }
    }
   }

   if((tokensChanged!=3) || isNaN(dateSelected) || isNaN(monthSelected) || isNaN(yearSelected)) {
    dateSelected = dateNow;
    monthSelected = monthNow;
    yearSelected = yearNow;
   }
   odateSelected=dateSelected;
   omonthSelected=monthSelected;
   oyearSelected=yearSelected;

   aTag = ctl;
   do {
    aTag = aTag.offsetParent;
    leftpos += aTag.offsetLeft;
    toppos += aTag.offsetTop;
   } while(aTag.tagName!=”BODY”);

   cleft = fixedX==-1 ? ctl.offsetLeft + leftpos : fixedX;
   ctop = fixedY==-1 ? ctl.offsetTop + ctl.offsetHeight + toppos : fixedY;
   constructCalendar (1, monthSelected, yearSelected);

   bShow = true;
   ctlNow = ctl;
  }
 }

init();

main.jsp

<script language=javascript src=”calendar.js”></script>

<input name=”tempDate” style=”background-color:#FFFFFF;” readonly=”readonly”/>
<div onclick=”popUpCalendar(this, tempDate, ‘yyyy/mm/dd(yoil)’);” style=”text-align:center; float:left; cursor: pointer;”>클릭</div>
 

자바스크립트 셀렉트박스(콤보박스) 동적 옵션추가

자바스크립트 셀렉트박스(콤보박스) 동적 옵션추가

var length = 10;

for(var i=0 ; i < length ; i ++){
    var op = new Option();
          op.value = ‘값’; // 값 설정
          op.text = “텍스트”; // 텍스트 설정
  
          //op.selected = true; // 선택된 상태 설정 (기본값은 false이며 선택된 상태로 만들 경우에만 사용)
         
     document.getElementById( “subuser_combobox” ).options.add(op); // 옵션 추가

   }

vba 행 높이, 열 높이 일괄정렬

vba 행 높이, 열 높이 일괄정렬

 

첨부된 bas파일을 엑셀 vba상에 가져오기 한 후 바로 사용가능 (컨트롤 j)

여러 셀을 선택한 상태에서 컨트롤 j를 누르면 전체 높이(너비)를 조정 가능

-주의: 병합된 셀이 포함되면 에러가 남

– 한 로우 또는 한 컬럼의 셀들을 선택하고 실행해야 함

– 너비인지 높이인지는 알아서 정해짐. 컬럼을 많이 선택했을 경우 높이를 결정하고, 로우를 많이 선택했을 경우 너비를 결정함.

– 0 이라고 입력하면 현재 높이(너비)를 출력

– 주의: 거꾸로 드래그 하면 오작동함. (반드시 좌에서 우로, 위에서 아래로 드래그 해서 선택해야 함)

 

 

Attribute VB_Name = “Module1”

Sub Macro2()
Attribute Macro2.VB_ProcData.VB_Invoke_Func = “j\n14”

‘ Macro2 Macro

‘ 바로 가기 키: Ctrl+j

basic_order = “row” ‘기준
    user_input = 0
   
    start_col = ActiveCell.Column ‘현재 열
    end_col = ActiveCell.Column + Selection.Columns.Count – 1
   
    start_row = ActiveCell.Row ‘현재 로우
    end_row = ActiveCell.Row + Selection.Rows.Count – 1
   
   
    If (end_row – start_row) > (end_col – start_col) Then
        basic_order = “row”
        user_input = InputBox(“목표 높이. 0 을 입력하면 높이의 합 출력”)
    Else
        basic_order = “col”
        user_input = InputBox(“목표 너비. 0 을 입력하면 너비의 합 출력”)
    End If
   
    ‘////////////////////////////////
   
    If (user_input = “”) Then
        End
    End If
   
    target = Int(user_input)
   
    If target < 0 Then
        End
    End If
       
   

   
    ‘/////////////////////////////////////////////

   
   
   
    ‘/////////////////////////////////////////
   
    ‘현재높이
   
    current = 0
    If basic_order = “row” Then
        For i = start_row To end_row
           
            Cells(i, start_col).Select
            current = current + Selection.RowHeight
       
        Next i
       
        Count = end_row – start_row + 1
       
    Else
        For i = start_col To end_col
           
            Cells(start_row, i).Select
            current = current + Selection.ColumnWidth
       
        Next i
       
        Count = end_col – start_col + 1
    End If
   
   
   
    If target = 0 Then
        Cells(start_row, start_col).Select
        MsgBox (“current ” & basic_order & “: ” & current)
        End
    End If
   
   
    ‘////////////////////////////////////////////
   
   
   
    ‘각자 채워야할 양 : (타겟 – 현재 높이)/ 갯수
    total_amount = target – current
    up_amount = total_amount / Count
   
   
    Call row_height_up(basic_order, start_row, end_row, start_col, end_col, up_amount)

   
End Sub

 

 

Function row_height_up(basic_order, start_row, end_row, start_col, end_col, up_amount)

    Dim strArr As String
    strArr = “”
   
    If basic_order = “row” Then
   
        For i = start_row To end_row
   
            Cells(i, start_col).Select
           
            temp = Selection.RowHeight ‘기존값
            Selection.RowHeight = temp + (up_amount) ‘증가된 값
           
            strArr = strArr & basic_order & Str(i) & “(” & Str(temp) & ” => ” & Str(Selection.RowHeight) & “), “
       
        Next i
   
    Else
      For i = start_col To end_col
     
            Cells(start_row, i).Select
           
            temp = Selection.ColumnWidth ‘기존값
            Selection.ColumnWidth = temp + (up_amount) ‘증가된 값
           
            strArr = strArr & basic_order & Str(i) & “(” & Str(temp) & ” => ” & Str(Selection.ColumnWidth) & “), “
       
        Next i
   
    End If
   
    MsgBox (strArr)

End Function

 

vba 유용한 소스(셀 선택)

vba 유용한 소스(셀 선택)

 

원하는 범위 선택

    row_1 = ActiveCell.Offset(0, 0).Row
    col_1 = ActiveCell.Offset(0, 0).Column

 

    Range(Cells(row_1, col_1 + 1), Cells(row_1, col_1 + 8)).Select

   ‘내 오른쪽 1칸부터 오른쪽 8칸까지 선택

 

머지(셀병합, 셀합치기)

    Range(Cells(row_1, col_1 + 1), Cells(row_1, col_1 + 8)).Merge

 

셀 배경 없애기

   Range(Cells(row_1, col_1 + 1), Cells(row_1, col_1 + 8)).Interior.Pattern = xlNone

 

선 없애기

    Rows(rrow & “:” & rrow).Borders(xlEdgeTop).LineStyle = xlNone

 

선 굵기

    Range(Cells(row_1, col_1 + 1), Cells(row_1, col_1 + 8)).Borders(xlEdgeBottom).Weight = xlMedium

xlThin이라고 쓰면 얇은 선.

 

 

새로운 줄 삽입

    Rows(“1:1”).Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

 

또는

    row_1 = ActiveCell.Offset(0, 0).Row

    Rows(row_1 & “:” & row_1).Select

    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

자바 파일 읽기, 파일 쓰기

자바 파일 읽기, 파일 쓰기

내용을 아래 링크로 대체합니다.

https://blog.naver.com/bb_/221587521823

JSP2.2 & Servlet3.0 챕터1 정리

JSP2.2 & Servlet3.0 챕터1 정리

오정원 지음 / 출판사 혜지원

서블릿(Servlet) : 동적 웹 구현 기술. 자바를 기반으로 하여 객체 지향적, 플랫폼 독립적, 스레드를 써서 사용자가 다수일수록 효율적.

프로세스: 실행 중인 상태의 프로그램을 말함.

스레드(Thread) : 하나의 프로세스 내에서 해당 프로세스가 할당받은 자원을 공유함. (프로세스의 자원을 참조할 뿐 새로 자원을 할당받는게 아니기 때문에 생성이 빠름)

3-tier 구조: 클라이언트, 결과 페이지를 전송하는 웹 서버, 비즈니스 로직이 구현되어 있는 어플리케이션 서버(ex: EJB로 구현되어 있는 WAS)

SOA(Service Oriented Architecture) : 1996년 가트너(Gartner) 그룹에 의해 처음 소개됨. 프로젝트 중심의 개발이 아니라 서비스를 중심으로 개발하는 것. 재활용성이 높아지며 비용절감과 효율성 증대

에 최적.

기존 CGI 방식의 가장 큰 단점은 서버 자원의 낭비 -> JSP는 스레드로 극복. 요청에 맞는 JSP 페이지의 서블릿 인스턴스를 단 한 번 생성하고, 이후 같은 요청이 들어올 경우 이미 있는 인스턴스에 스레

드 단위로 요청을 처리

인스턴스(Instance) : 클래스로부터 만들어진 객체를 뜻함. (클래스를 객체로 만드는 과정: Instantiate(인스턴스화)).

객체와 인스턴스의 차이: 인스턴스는 실제 사용할 수 있게 메모리에 생성된 객체.

MVC 패턴 (Model-View-Controller) : 중대형 프로젝트에서 효율적이라 평가받는 디자인 패턴. JSP(View) – 자바빈즈(Model) – 서블릿(Controller) 로 분업하여 효율적인 개발가능.

※ 디자인 패턴 : 문제 해결을 위한 지침. 효과적이라 판명받은 설계구조.

서블릿(Servlet): HTML은 정적임. 사용자 요청에 따라 HTML을 생산해낼 수 있는 자바 진영의 기술이 서블릿임.
웹 서버 상에서 실행되는 자바의 클래스 파일임. javax.servlet.Servlet 인터페이스를 구현(Implements)해서 작성해야만 함. 입력과 출력을 HTTP 프로토콜의 요청(Request)과 응답(Response)의 형태로 다

룬다는 점만이 일반 클래스와 다르다. Server Side Applet, 서버 사이드의 자바 응용 프로그램이라는 뜻.

※ 애플릿(Applet): 패널(Panel)을 상속하는 클래스로, 웹 브라우저에 담겨서 실행되는 작은 응용 프로그램을 말함.

※ JSP에 서블릿이 꼭 필요한가: JSP로 요청이 되어도 컨테이너는 JSP 파일을 서블릿 형태의 자바코드로 변환한 후 서블릿 라이프사이클을 거쳐 요청을 처리함. 어차피 같음.

HTTP(HyperText Transfer Protocol) : 웹 브라우저 통신에 관한 규약.

※ 프로토콜(Protocol) : 통신규약

□ HTTP 프로토콜의 구조: HTTP 프로토콜은 요청(Request)과 응답(Response)로 나뉨.

HTTP ┌ Request ┌ GET
        │              └ POST
        └ Response

HTTP 메시지 : 시작라인+헤더(일반헤더+요청 또는 응답헤더)+바디(메시지)

(1) Request (HTTP 요청 메시지) : GET 방식의 요청메시지와 POST 방식의 요청메시지로 나뉨.

-GET방식의 요청 : 길이 256바이트를 넘을 수 없음. 바디(본문)이 없기 때문에 조금 빠름.
  시작라인 : GET /myhome/mypage.jsp?name=’woo_sung_ho’&email=’bb_@naver.com’ HTTP/1.1
  요청헤더 : Host:www.myhome.com
             User-Agent: Mozilla/5.0 …

  (바디: 없음)

-POST방식의 요청: 파라미터가 바디에 속해 보이지 않음. 보안상 유용.
  시작라인 : GET /myhome/mypage.jsp HTTP/1.1
  응답헤더 : Host:www.myhome.com
             User-Agent: Mozilla/5.0 …

  바디: name=’woo_sung_ho’&email=’bb_@naver.com’

(2) Response (HTTP 응답 메시지)

□ 웹 서버

웹 서버는 HTTP서버와 웹 컨테이너로 나뉨.

-HTTP 서버 : 어떤 URL 요청이 들어왔을 경우 미리 매핑되어 있는 콘텐츠(HTML파일이나 이미지)를 응답 형태로 전송함.

단, 요청 URL이 서블릿 클래스 또는 JSP 파일(ex: http ://www.servlet.com/servlet 또는 http ://www.servlet.com/home.jsp)일 경우 HTTP서버는 요청을 웹 컨테이너로 넘김.

-웹 컨테이너(Web Container) : 요청된 URL에 따라 미리 설정된 서블릿 클래스 또는 JSP 파일을 실행하여 결과를 HTTP 서버에 넘겨줌.
ex) 자카르타 톰캣, 웹로직, Resin
※ 서블릿 컨테이너: 서블릿 컨테이너에 대한 웹 컨테이너 / JSP 컨테이너: JSP 파일에 대한 웹 컨테이너.
   서블릿 컨테이너, JSP컨테이너 모두 웹 컨테이너에 속함.

클라이언트 —– 웹 서버 —– 컨테이너

□ 서블릿의 동작 원리
1. 클라이언트: http ://servlet.com/servlet 요청
2. 웹서버: 요청된 서블릿 확인후 컨테이너로 요청
3. 컨테이너: request와 response 객체 생성후 web.xml 참조하여 해당 서블릿의 스레드 생성 후 service 메소드 호출
4. 컨테이너: service 메소드에서는 요청 방식에 따라 doGet이나 doPost 메소드 호출
5. doGet이나 doPost 메소드에서 응답 생성

또는,

1. 사용자의 URL요청
2. request,response 객체 생성
3. 서블릿 인스턴스와 스레드 생성
4. service() 메소드 호출과 서블릿 클래스 실행
5. 응답과 스레드의 소멸

<서블릿의 동작 원리 설명>

사용자 URL 요청

 -> 배포 서술자에 따라, 서블릿을 담당하는 웹 컨테이너로 요청 전달

 -> request와 response객체 생성 (javax.servlet.http.HttpServletRequest 객체 타입,

javax.servlet.http.HttpServletResponse 객체 타입)

 -> 배포 서술자에 따라, 필요한 서블릿 클래스를 알아내고 인스턴스 생성

 ※ 해당 클래스가 메모리에 없으면 인스턴스를 생성(메모리에 로드)하고, init() 메소드 실행으로 초기화하여 스레드 하나 생성함. 이미 인스턴스가 있다면 기존 인스턴스에 스레드만 하나 새로 생성. 각 서블릿 인스턴스는 웹 컨테이너당 하나만 존재하므로 init()메소드는 각 서블릿당 한 번씩만 호출된다.

※ 배포 서술자(Deployment Descriptor) : URL과 서블릿 클래스를 미리 매핑시켜 놓은 파일. ex) web.xml

 -> 스레드가 생성되면 각 스레드에서 service()메소드가 호출되며, HTTP요청방식에 따라 doGet() 또는 doPost() 메소드가 request, response 객체를 인자로 자동 호출됨.

 ※ 개발자는 doGet(), doPost() 메소드 부분에 페이지 생성을 할 수 있는 코드를 만들어야 함.

-> doGet(), doPost()메소드에서 동적인 웹 페이지를 생성했다면 결과물을 response 객체에 담아 웹 컨테이너가 HTTP 응답(Response) 형태로 바꾸어 웹 서버로 전송. 사용이 끝난 request, response 객체를 소멸시키고 스레드를 종료하게 됨.

-> 웹 서버는 HTTP 응답 메시지를 사용자 브라우저로 전송하고 사용자는 브라우저를 통해 동적으로 생성된 페이지를 받아보게 됨.

WAS의 정의

WAS의 정의

WAS(Web Application Server)는 웹과 기업의 기간시스템 사이에 위치해 웹 기반의 분산시스템 개발을 도와주고 안정적인 웹 트랜잭션 처리를 보장해주는 미들웨어를 말한다. 기업환경이 클라이언트/서버 환경에서 웹 기반 환경으로 변화하면서 웹을 효율적으로 구현할 수 있는 WAS가 e-비즈니스 체제를 완성하려는 웹 기반의 핵심 솔루션으로 각광받고 있다.

국내 WAS 시장은 BEA코리아(제품명 웹로직)와 한국IBM(제품명 웹스피어) 등 외국계 업체들이 주도하던 시장에 국산 토종업체인 티맥스소프트(제품명 제우스)가 진입해 빠른 속도로 시장점유율을 높여나가며 선두 경쟁을 벌이고 있다.

WAS는 Web application을 수행할 수 있는 환경 및 엔터프라이즈 환경에 필요한 트랜잭션, 보안, 트래픽 관리, DB 커넥션 풀, 사용자 관리 등을 지원하는 서버로 대개 java(J2EE) 기반으로 되어 있다. 유명 WAS인 weblogic, websphere 모두 java 기반이다.

윈도우 host파일 위치

윈도우 host파일 위치

C:\Windows\System32\drivers\etc\hosts

메모장(우클릭 후 관리자 권한으로 실행)으로 수정가능.

검색용쿼리 웨어절만드는 메소드

//검색용쿼리 만드는 메소드
 public StringBuffer makeWhereQuery(StringBuffer whereQuery, String column, String SearchTXT){
  //쿼리 만들기
  if(column.indexOf(“||”)>=0){
   //컬럼이 여러 개 일경우
   StringTokenizer stk=new StringTokenizer(column,”||”);
   
   //총 갯수
   int typeCnt=stk.countTokens();
   
   for(int i=0;i<typeCnt;i++){
    whereQuery.append(” “+stk.nextToken());
    whereQuery.append(” like “);
    whereQuery.append(” ‘%”+SearchTXT+”%’ “);
    
    if(i<typeCnt-1){
     //마지막이 아니라면 or를 붙이기
     whereQuery.append(” or “);
    }
   }
  }
  else{
   //컬럼이 한 개 일경우
   whereQuery.append(” “+column);
   whereQuery.append(” like “);
   whereQuery.append(” ‘%”+SearchTXT+”%’ “);
  }
  //System.out.println(“쿼리의 웨어절: “+whereQuery);
  return whereQuery;
 }

—————————————————————————

makeWhereQuery(스트링버퍼, 대상컬럼, 찾을문자열); 로 쓰면 된다.

예를 들어서

StringBuffer whereQuery=new StringBuffer();
makeWhereQuery(whereQuery, “emp_no||emp_name||rank||tel_no||address||parent_ou||parent_org_id”, “2”);

라고 쓰면

스트링버퍼의 값이

emp_no like  ‘%2%’  or  emp_name like  ‘%2%’  or  rank like  ‘%2%’  or  tel_no like  ‘%2%’  or  address like  ‘%2%’  or  parent_ou like  ‘%2%’  or  parent_org_id like  ‘%2%’

로 변한다.

Java Swing Jlist 자바 리스트박스

Java Swing Jlist 자바 리스트박스

package com.form;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

public class FormRef extends JFrame{
 public FormRef(){
  //레이아웃 없음
  getContentPane().setLayout(null);
  
  //크기 설정
  setSize(800,300);
  
  //화면 가운데 뜨게하기
  Dimension frameSize=getSize();
  Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
  setBounds((screenSize.width-frameSize.width)/2,
    (screenSize.height-frameSize.height)/2,
    frameSize.width,
    frameSize.height);
  
  //최대화 금지(비활성화)
  setResizable(false);
  
  Vector vector =new Vector<>();
  vector.addElement(“문서1”);
  vector.addElement(“문서2”);
  vector.addElement(“문서3”);
  vector.addElement(“문서4”);
  vector.addElement(“문서5”);
  vector.addElement(“문서6”);
  
  
  JList jlist=new JList();
  jlist.setListData(vector);
  
  JScrollPane jp=new JScrollPane(jlist);
  jp.setBounds(0,0,790,260);

  getContentPane().add(jp);
  jp.setVisible(true);
  
  jlist.setSelectedIndex(0);
  
  
  setVisible(true);
  
 }
}

오라클 문자를 날짜로(to_date)

오라클 문자를 날짜로(to_date)

TO_DATE(‘20150101’, ‘YYYYMMDD’)
TO_DATE(‘20150131235959’, ‘YYYYMMDDHH24MISS’)

오류(error)

오류(error)

컴파일 오류(Compile error)

 – 구문 오류(Syntax error): 문법 오류

 – 의미 오류(Semantic error): 서로 다른 타입의 데이터를 연산

실행 오류(Run time error): 실행 도중 멈추고 중단됨. 대표적으로 0으로 나누는 경우. 예외(Exception)를 사용하여 처리.

논리 오류(Logical error): 의도치 않은 실행결과. (컴파일도 되고 실행도 됨.) -> 디버깅(Debugging)을 통해 고쳐야 함.

임시

ㅇ임시

 

package com;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class SecondClass {

 public static void main(String[] args) {
 
 
  //그림1을 얻어옴
  //BufferedImage bimg=txtToImg(“경제”, “돋움”, 12);//네이버
  BufferedImage bimg=txtToImg(“애플워치”, “굴림”, 12);
 
  //스크린샷 찍음
  BufferedImage scrn=screenShot();
 
  //그림1과 스크린샷을 비교
  boolean includ=includeImg(scrn, bimg);
 
  System.out.println(includ);
 }
 //////////////////////////////////////////////////////////////
 //글자를 그림으로 변경
 public static BufferedImage txtToImg(String str,String fontName,int fontSize){
  //int fontSize=i+1;
  //String str=”휴지통”;
 
  BufferedImage img = new BufferedImage(fontSize*str.length(), (int)(fontSize*1), BufferedImage.TYPE_INT_RGB);
 
  Graphics2D graphics = img.createGraphics();
 
  //흰색으로 색칠
  graphics.fillRect(0, 0, fontSize*str.length(), (int)(fontSize*1));
  //graphics.setBackground(new Color(255,100,50));
  graphics.setColor(new Color(0,0,0));
 
  //글자를 출력
  graphics.setFont(new Font(fontName, 0, fontSize));
  graphics.drawString(str, 0, (int)(fontSize*0.9));
 
  //graphics.setFont(new Font(“돋움”, 0, fontSize));
  //graphics.drawString(str, 0, (int)(fontSize*0.9));
 
 
  File file=new File(“c:/a/make.bmp”);
  try{
    ImageIO.write(img, “bmp”, file);
  }catch(Exception ex){System.out.println(ex.getMessage());}
 
  return img;
 }
 ///////////////////////////////////////////////////////////
 //화면 스크린샷을 버퍼드 이미지에 저장하는 메소드
 public static BufferedImage screenShot(){
  //스크린샷하기
  BufferedImage scrn=null;//버퍼드이미지 선언
  try{
   //해상도 구하기
   Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
  
   //스크린샷 찍기
   Robot robot=new Robot();
   scrn=robot.createScreenCapture(new Rectangle(0, 0, (int)screenSize.getWidth(), (int)screenSize.getHeight()));
  
   //스크린샷 파일화
   //ImageIO.write(scrn, “bmp”, new File(“c:/a/res.bmp”));
  
  }catch(Exception ex){System.out.println(ex.getMessage());}
  return scrn;
 }
 ////////////////////////////////////////////////////////////////////////
 public static boolean checkAround(BufferedImage img,int x,int y,int mode){
  //하나라도 원하는 색상이 있으면 true를 돌려줌
  boolean res=false;
 
  int startX=x;
  int startY=y;
  int endX=x;
  int endY=y;
  int gap=1;
  try{
   //갭 조절
   if(x-gap>0){startX=x-gap;}else{startX=x;}
   if(y-gap>0){startY=y-gap;}else{startY=y;}
   if(x+gap<=img.getWidth()-1){endX=x+gap;}else{endX=img.getWidth()-1;}
   if(y+gap<=img.getHeight()-1){endY=y+gap;}else{endY=img.getHeight()-1;}
  
   for(int i=startX;i<=endX;i++){
    for(int j=startY;j<=endY;j++){
     if(mode==0){//흑색
      if(isDark(img.getRGB(i, j))){
       res=true;
       break;
      }
     }
     else if(mode==1){//흰색
      if(isLight(img.getRGB(i, j))){
       res=true;
       break;
      }
     }
    }
   
   }
  }catch(Exception ex){System.out.println(ex.getMessage()+” “+startX+” “+endX+” “+startY+” “+endY);}
  return res;
 }
////////////////////////////////////////////////////////////////////
 public static boolean isDark(int rgb){
  boolean res=false;
  Color c=new Color(rgb);
  if(c.getRed()+c.getGreen()+c.getBlue() < 300){
   res=true;
  }
   
  return res;
 }
 
 public static boolean isLight(int rgb){
  boolean res=false;
  Color c=new Color(rgb);
  if(c.getRed()+c.getGreen()+c.getBlue() > 700){
   res=true;
  }
   
  return res;
 }
 
 ////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////
 //큰 그림에 작은 그림이 속하는지(포함하는지) 검사하는 메소드
 public static boolean includeImg(BufferedImage bigImg, BufferedImage smImg){
  boolean res=false;
 
  for(int xs=0;xs<bigImg.getWidth()-smImg.getWidth();xs++){
   for(int ys=0;ys<bigImg.getHeight()-smImg.getHeight();ys++){
 
    //System.out.println(xs+” “+ys+”를 검사”);
    for(int i=xs;i<xs+smImg.getWidth();i++){
     for(int j=ys;j<ys+smImg.getHeight();j++){
      //System.out.println(i+” “+j);
      //같으면
      int bigRGB=bigImg.getRGB(i, j);
      int smallRGB=smImg.getRGB(i-xs, j-ys);
     
      Color bigClr=new Color(bigRGB);
      Color smallClr=new Color(smallRGB);
//      if(bigClr.getBlue()==0){
//       System.out.println(bigRGB+ ” “+bigClr);
//      }

      if(smallRGB==-1){//작은 그림이 흰색이라면 배경
       //같은 흰색인지 검사
       if(checkAround(bigImg, i, j, 1)){//하나라도 흰색이 있으면
       //같은 흰색계열이라면 오케이
        res=true;
        continue;
       }
       else{
       //어두운 계열이라면 취소
        res=false;
        break;
       }
      }
      else{//작은 그림이 흰색이 아니라면 글자임.
       //같은 검은색인지 검사
       if(checkAround(bigImg, i, j, 0)){//하나라도 검은색이 있으면
        res=true;
        continue;
       }
       else{
        res=false;
        break;
       }
      }
     }
     if(res==false){break;}//다르면 나감
    }
    if(res==true){
     
     System.out.println(“발견좌표:”+xs+”,”+ys+” w:”+smImg.getWidth()+” h:”+smImg.getHeight());
    
       BufferedImage scrn=null;//버퍼드이미지 선언
       try{
        //스크린샷 찍기
        Robot robot=new Robot();
        scrn=robot.createScreenCapture(new Rectangle(xs, ys, smImg.getWidth(), smImg.getHeight()));
       
        //스크린샷 파일화
        ImageIO.write(scrn, “bmp”, new File(“c:/a/result.bmp”));
       
       }catch(Exception ex){System.out.println(ex.getMessage());}
   
     break;
    }
   }
   if(res==true){break;}
  }
  return res;
 }

}

 

자바 그림에서 글자 찾기

자바 그림에서 글자 찾기

 

원하는 텍스트, 폰트종류, 폰트크기를 input하면
화면 상에서 해당 글자를 찾아내는 메소드를 만들었음
한계점은 정확히 폰트 종류, 폰트 크기, 자간이 같아야만 찾아낸다는 점이다.

 

1. 텍스트를 그림(bufferdImage)으로 만든다. 이를 스몰이미지라고 하자.

2. 현재 화면을 스크린샷 찍는다. 빅 이미지라고 하자.

3. 스물 이미지가 빅 이미지에 포함되어 있는지 확인한다(4중 포문).

 

이 때, 가장 처음 발견된 폰트색깔을 기억한 후

뒤에 나오는 폰트색깔과 일치하는지를 점검한다.

(이렇게 하면 찾는 글자가 검은색이든 흰색이든 찾아낼 수 있다)

 

한계: 정확히 같은 폰트종류와 크기, 자간이어야만 찾아낸다.

——————————————————————————-

package com;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class SecondClass {

 public static void main(String[] args) {
 
 
  //그림1을 얻어옴
  BufferedImage bimg=txtToImg(“글자인식”, “돋움”, 16);//16);
 
  //스크린샷 찍음
  BufferedImage scrn=screenShot();
 
  //그림1과 스크린샷을 비교
  boolean includ=includeImg(scrn, bimg);
 
  System.out.println(includ);
 }
 //////////////////////////////////////////////////////////////
 //글자를 그림으로 변경
 public static BufferedImage txtToImg(String str,String fontName,int fontSize){
  //int fontSize=i+1;
  //String str=”휴지통”;
 
  BufferedImage img = new BufferedImage(fontSize*str.length(), (int)(fontSize*1), BufferedImage.TYPE_INT_RGB);
 
  Graphics2D graphics = img.createGraphics();
 
  //흰색으로 색칠
  graphics.fillRect(0, 0, fontSize*str.length(), (int)(fontSize*1));
  //graphics.setBackground(new Color(255,100,50));
  graphics.setColor(new Color(0,0,0));
  graphics.setFont(new Font(fontName, 0, fontSize));
 
  //글자를 출력
  graphics.drawString(str, 0, (int)(fontSize*0.9));
 
  File file=new File(“c:/a/make.bmp”);
  try{
    ImageIO.write(img, “bmp”, file);
  }catch(Exception ex){System.out.println(ex.getMessage());}
 
  return img;
 }
 ///////////////////////////////////////////////////////////
 //화면 스크린샷을 버퍼드 이미지에 저장하는 메소드
 public static BufferedImage screenShot(){
  //스크린샷하기
  BufferedImage scrn=null;//버퍼드이미지 선언
  try{
   //해상도 구하기
   Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
  
   //스크린샷 찍기
   Robot robot=new Robot();
   scrn=robot.createScreenCapture(new Rectangle(0, 0, (int)screenSize.getWidth(), (int)screenSize.getHeight()));
  
   //스크린샷 파일화
   //ImageIO.write(scrn, “bmp”, new File(“c:/a/res.bmp”));
  
  }catch(Exception ex){System.out.println(ex.getMessage());}
  return scrn;
 }
 ////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////
 //큰 그림에 작은 그림이 속하는지(포함하는지) 검사하는 메소드
 public static boolean includeImg(BufferedImage bigImg, BufferedImage smImg){
  boolean res=false;
 
  for(int xs=0;xs<bigImg.getWidth()-smImg.getWidth();xs++){
   for(int ys=0;ys<bigImg.getHeight()-smImg.getHeight();ys++){
   
 int fontColor=-9999;
 
    //System.out.println(xs+” “+ys+”를 검사”);
    for(int i=xs;i<xs+smImg.getWidth();i++){
     for(int j=ys;j<ys+smImg.getHeight();j++){
      //System.out.println(i+” “+j);
      //같으면
      int bigRGB=bigImg.getRGB(i, j);
      int smallRGB=smImg.getRGB(i-xs, j-ys);
     
      Color bigClr=new Color(bigRGB);
      Color smallClr=new Color(smallRGB);

      if(smallRGB==-1){//작은 그림이 흰색이라면 배경
    //폰트 색이 지정되어있지 않다면 스킵
       if(fontColor==-9999){//폰트색이 지정되어있지 않다면
        res=true;
        continue;
       }
       else{
        //폰트 색이 지정되어 있다면
        if(bigRGB!=fontColor){
         //폰트색과 배경색이 다르다면 스킵
         res=true;
               continue;
        }
        else{
         //폰트색과 배경색이 같으면 안됨
         res=false;
            break;
        }
       }
      }
      else{//작은 그림이 흰색이 아니라면 글자
       if(fontColor==-9999){//폰트색이 지정되어있지 않다면
        fontColor=bigRGB;//큰그림의 현재색을 기억함(이것이 폰트색 기준이됨)
        res=true;
        continue;
       }
       else{
        //폰트색이 지정되어 있다면
        if(bigRGB==fontColor){
         //지정색과 같을 경우엔 스킵
         res=true;
               continue;
        }
        else{
         res=false;
            break;
        }
       }
      }
     }
     if(res==false){break;}//다르면 나감
    }
    if(res==true){
     
     System.out.println(“발견좌표:”+xs+”,”+ys+” w:”+smImg.getWidth()+” h:”+smImg.getHeight());
    
       BufferedImage scrn=null;//버퍼드이미지 선언
       try{
        //스크린샷 찍기
        Robot robot=new Robot();
        scrn=robot.createScreenCapture(new Rectangle(xs, ys, smImg.getWidth(), smImg.getHeight()));
       
        //스크린샷 파일화
        ImageIO.write(scrn, “bmp”, new File(“c:/a/result.bmp”));
       
       }catch(Exception ex){System.out.println(ex.getMessage());}
   
     break;
    }
   }
   if(res==true){break;}
  }
  return res;
 }

}

 

자바 그림비교 메소드 (bufferedImage 비교)

자바 그림비교 메소드 (bufferedImage 비교)

bufferedImage를 비교하는 메소드는 다음과 같다. 이 메소드는 그림 두 개가 크기(getWidth, getHeight)와 색상값(getRGB)이 완벽히 같은지 비교한다.

 //버퍼상의 이미지 두 개를 비교하는 메소드
  boolean bufferedImagesEqual(BufferedImage img1, BufferedImage img2) {
     if (img1.getWidth() == img2.getWidth() && img1.getHeight() == img2.getHeight()) {
         for (int x = 0; x < img1.getWidth(); x++) {
             for (int y = 0; y < img1.getHeight(); y++) {
                 if (img1.getRGB(x, y) != img2.getRGB(x, y))
                     return false;
             }
         }
     } else {
         return false;
     }
     return true;
 }

————————————————————————————————–


이를 발전시키면 작은 그림이 큰 그림에 포함되는지 확인하는 메소드를 만들 수 있다.

버퍼상의 이미지 두 개를 비교해서 큰 이미지 속에 작은 이미지가 포함하는지 알아낼 수 있다.

package com;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class SecondClass {

 public static void main(String[] args) {
  
  
  //그림1을 얻어옴
  BufferedImage bimg=null;
  try{
   File file=new File(“c:/a/00.bmp”);
   bimg=ImageIO.read(file);
  }catch(Exception ex){System.out.println(ex.getMessage());}
 
  
  //스크린샷 찍음
  BufferedImage scrn=screenShot();
  
  //그림1과 스크린샷을 비교
  boolean includ=includeImg(scrn, bimg);
  
  System.out.println(includ);
 }
 
 //화면 스크린샷을 버퍼드 이미지에 저장하는 메소드
 public static BufferedImage screenShot(){
  //스크린샷하기
  BufferedImage scrn=null;//버퍼드이미지 선언
  try{
   //해상도 구하기
   Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
   
   //스크린샷 찍기
   Robot robot=new Robot();
   scrn=robot.createScreenCapture(new Rectangle(0, 0, (int)screenSize.getWidth(), (int)screenSize.getHeight()));
   
   //스크린샷 파일화
   //ImageIO.write(scrn, “jpeg”, new File(“c:/a/res.jpeg”));
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
  return scrn;
 }
 
 //큰 그림에 작은 그림이 속하는지(포함하는지) 검사하는 메소드
 public static boolean includeImg(BufferedImage bigImg, BufferedImage smImg){
  boolean res=false;
  
  for(int xs=0;xs<bigImg.getWidth()-smImg.getWidth();xs++){
   for(int ys=0;ys<bigImg.getHeight()-smImg.getHeight();ys++){
    
    //System.out.println(xs+” “+ys+”를 검사”);
    for(int i=xs;i<xs+smImg.getWidth();i++){
     for(int j=ys;j<ys+smImg.getHeight();j++){
      //System.out.println(i+” “+j);
      if(bigImg.getRGB(i, j)!=smImg.getRGB(i-xs, j-ys)){
       //픽셀값을 비교해서 다르면 체크
       res=false;
       break;
      }
      else{
       res=true;
      }
     }
     if(res==false){break;}//다르면 나감
    }
    if(res==true){
     System.out.println(“발견좌표:”+xs+”,”+ys+” w:”+smImg.getWidth()+” h:”+smImg.getHeight());
     break;
    }
   }
   if(res==true){break;}
  }
  return res;
 }

}
 

파워자바 1장

파워자바 1장

Write Once, Run Everywhere!

자바파일 –(컴파일러)–>바이트 코드 –(자바 가상기계)–> 윈도우, 리눅스, Mac 어디서든 실행

ex) Hello.java –(컴파일러)–>Hello.class –(자바 가상기계)–> Hello

1. JSP(자바 서버 페이지) : HTML 안에 자바코드가 있음. 웹페이지와 사용자가 상호작용 가능.

2. 자바 애플릿: 웹서버로부터 다운로드되어서 클라이언트 컴퓨터에서 실행되는 프로그램. 웹브라우저 안에서 출력됨.

3. 자바 서블릿: 웹서버에서 동작하는 서버모듈. 클라이언트의 요구를 받아서 서버에서 처리 한 후 실행결과를 HTML으로 전송한다.

4. 자바빈즈: 자바로 작성된 컴포넌트. 애플리케이션을 만들기 위한 일종의 빌딩 블록. 결합 가능, 재사용 가능. 컴포넌트(빈즈)를 조립하면 빠르게 애플리케이션 작성 가능하다.

자바 문자열을 그림으로 만들기

자바 문자열을 그림으로 만들기

실행결과:

package com;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class MainClass {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  for(int i=0;i<50;i++){
   int fontSize=i+1;
   String str=”휴지통”;
   
   BufferedImage img = new BufferedImage(fontSize*str.length(), (int)(fontSize*1.2), BufferedImage.TYPE_INT_RGB);
   Graphics2D graphics = img.createGraphics();
   
   graphics.setBackground(new Color(255,100,50));
   graphics.setColor(new Color(255,255,255));
   graphics.setFont(new Font(“굴림”, 0, fontSize));
   
   //글자를 출력
   graphics.drawString(str, 0, fontSize);
   
   File file=new File(“c:/a/b”+i+”.jpeg”);
   try{
    ImageIO.write(img, “jpeg”, file);
    
   }catch(Exception ex){System.out.println(ex.getMessage());}
  }

 }

}

 

 

 

 

————————-

 

BufferedImage img = new BufferedImage(fontSize*str.length(), (int)(fontSize*1), BufferedImage.TYPE_INT_RGB);

에서 *1.1 을 *1 로 바꾸고,
graphics.drawString(str, 0, (int)(fontSize*0.9));

에서 fontSize를 하면 *0.9하면 그림 여백을 더 없앨 수 있음.

 

graphics.fillRect(0, 0, fontSize*str.length(), (int)(fontSize*1));

하면 배경을 하얗게 만들 수 있음.

 

자바 해상도 구하기

자바 해상도 구하기

 

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();

크기조절되는 반투명 창(JFrame)

크기조절되는 반투명 창(JFrame)

package com;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class FormCtrl {
 
 public static void main(String[] args) {
  new FormMeasure();
 }

}

class FormMeasure extends JFrame{
 
 int mode;
 int preMx;
 int preMy;
 
 public FormMeasure(){
  setSize(300, 300);
  //setBackground(new Color(255,10,10));
  
  setUndecorated(true);//프레임 없애기
  setForeground(new Color(0, 0, 255));
  getContentPane().setBackground(new Color(0, 0, 255));//파란색
  setOpacity(0.2f);//반투명
  
  
  //setResizable(false);//최대화 불가능
  setVisible(true);
  
  preMx=0;
  preMy=0;
  
  addMouseMotionListener(new MouseMotionListener() {
   
   @Override
   public void mouseMoved(MouseEvent e) {
    // TODO Auto-generated method stub
    //System.out.println(“움직임”);
   }
   
   @Override
   public void mouseDragged(MouseEvent e) {
    int gap=20;
    
    int newMx=e.getX();
    int newMy=e.getY();
    
    //width를 조절하는 경우
    if(mode==1){
     int wid=getBounds().width+newMx-preMx;
     if(wid<40) wid=40;
     if(newMx<0) wid=40;
     
     setBounds(getBounds().x,
       getBounds().y,
       wid,
       getBounds().height);
     preMx=newMx;
    }
    //height를 조절하는 경우
    else if(mode==2){
     int hei=getBounds().height+newMy-preMy;
     if(hei<40) hei=40;
     if(newMy<0) hei=40;
     
     setBounds(getBounds().x,
       getBounds().y,
       getBounds().width,
       hei);
     preMy=newMy;
    }
    //width와 height를 둘 다 조절하는 경우
    else if(mode==3){
     int wid=getBounds().width+newMx-preMx;
     if(wid<40) wid=40;
     if(newMx<0) wid=40;
     
     int hei=getBounds().height+newMy-preMy;
     if(hei<40) hei=40;
     if(newMy<0) hei=40;
     
     setBounds(getBounds().x,
       getBounds().y,
       wid,
       hei);
     preMx=newMx;
     preMy=newMy;
    }
    //창을 이동하는 경우(일반 드래그)
    else if(mode==10){
     //일반 드래그
     setBounds(getBounds().x+newMx-preMx,
       getBounds().y+newMy-preMy,
       getBounds().width,
       getBounds().height);
    }
    
   }
  });
  
  addMouseListener(new MouseListener() {
   
   @Override
   public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
    
   }
   
   @Override
   public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

    //경계선에서 20픽셀 이내이면 크기조절
    int gap=20;
    
    preMx=e.getX();
    preMy=e.getY();
    
    //click=true;
    if(preMx>getBounds().width-gap && preMy>getBounds().height-gap){
     //오른쪽 아래 꼭지점
     mode=3;
    }
    else if(preMx>getBounds().width-gap){
     //오른쪽 끝선
     mode=1;
     
    }
    else if(preMy>getBounds().height-gap){
     //아래쪽
     mode=2;
     
    }
    else{
     mode=10;
    }
    
    
   }
   
   @Override
   public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
    
   }
   
   @Override
   public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub
    
   }
   
   @Override
   public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub
    
   }
  });
 }
}

Swing JTextArea 에서 라인 교환(줄바꿈)

Swing JTextArea 에서 라인 교환(줄바꿈)

 

alt+위방향키(alt+↑)를 누르면 현재 라인과 위 라인이 교환되고, alt+아래방향키(alt+↓)를 누르면 현재 라인과 아래 라인이 교환되는 메소드를 만들었다. exchangeTxt(String txt, int o1, int o2, int n1, int n2)이다. 우선 txt에 전체 텍스트, o1과 o2에는 텍스트 일부(A)의 처음과 끝 지점, n1고 n2에는 다른 텍스트 일부(B)의 처음과 끝 지점을 쓰면 나머지 텍스트는 그대로인채 A 부분과 B 부분이 바뀐다.

 

 

package com;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;

public class MainClass{

 public static void main(String[] args) {
  MainForm mf=new MainForm();
 }
}

class MainForm extends JFrame{
 
 public String exchangeTxt(String txt, int o1, int o2, int n1, int n2){
  //old->new
  StringBuffer oldt=new StringBuffer(txt);
  StringBuffer newt=new StringBuffer();
  
  newt.append(oldt.substring(0,o1));
  
  newt.append(oldt.substring(n1,n2));
  if(!newt.substring(newt.length()-1).equals(“\n”)){
   newt.append(“\n”);
   System.out.println(“마지막줄이므로 \\n추가“);
  }
  newt.append(oldt.substring(o1,o2));
  
  newt.append(oldt.substring(n2));
  
  return newt.toString().trim();
 }
 
 JTextArea jta;
 
 public MainForm() {
  
  jta=new JTextArea();
  jta.setBackground(Color.white);
  jta.setBounds(10, 10, 260, 300);
  
  jta.addKeyListener(new KeyListener() {
   
   @Override
   public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub
    
   }
   
   @Override
   public void keyReleased(KeyEvent e) {
    //Alt+아래 화살표키
    if(e.isAltDown() && e.getKeyCode()==40){
     try {
      //현재 커서가 위치한 곳이 몇 번째 줄인지 알아내기
      int line=jta.getLineOfOffset(jta.getCaretPosition());

      if(line<jta.getLineCount()-1){
       //현재 라인: 현재 커서가 있는 라인의 처음부터 끝까지를 자름
       int start=jta.getLineStartOffset(line);
       int end=jta.getLineEndOffset(line);
       
       //다음 라인: 다음 줄의 처음부터 끝까지를 자름
       int start2=jta.getLineStartOffset(line+1);
       int end2=jta.getLineEndOffset(line+1);
       
       //현재라인과 다음라인을 교체함
       jta.setText(exchangeTxt(jta.getText(), start, end, start2, end2));
       
       //다음 라인(line+1) 끝에 커서를 위치함 (마지막에 -1을 하는 이유는 마지막 부분이 \n이기 때문
       jta.setCaretPosition(jta.getLineEndOffset(line+1)-1);
      }
      else{
       System.out.println(“가장 아랫줄입니다”);
      }
      
     } catch (BadLocationException e1) {e1.printStackTrace();}
     
    //Alt+위 화살표키 
    }else if(e.isAltDown() && e.getKeyCode()==38){
     try {
      //현재 커서가 위치한 곳이 몇 번째 줄인지 알아내기
      int line=jta.getLineOfOffset(jta.getCaretPosition());
      
      if(line>0){
       //이전 라인: 현재 커서가 있는 라인 바로 이전 라인의 처음부터 끝까지를 자름
       int start=jta.getLineStartOffset(line-1);
       int end=jta.getLineEndOffset(line-1);
       
       //현재 라인: 현재 커서가 있는 라인의 처음부터 끝까지를 자름
       int start2=jta.getLineStartOffset(line);
       int end2=jta.getLineEndOffset(line);
       
       //이전라인과 현재라인을 교체함
       jta.setText(exchangeTxt(jta.getText(), start, end, start2, end2));
       
       //이전 라인(line-1) 끝에 커서를 위치함 (마지막에 -1을 하는 이유는 마지막 부분이 \n이기 때문
       jta.setCaretPosition(jta.getLineEndOffset(line-1)-1);
      }
      else{
       System.out.println(“가장 윗줄입니다”);
      }
      
     } catch (BadLocationException e1) {e1.printStackTrace();}
    }
   }
   
   @Override
   public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
    
   }
  });
  
  getContentPane().setLayout(null);
  setSize(300,400);
  getContentPane().add(jta);
  
  setVisible(true);
 }
}

원하는 윈도우 찾고 포커스하기(getHwnd)

원하는 윈도우 찾고 포커스하기(getHwnd)

getHwnd라는 메소드를 직접 만들었다. 우선, 띄워져 있는 윈도우 목록을 전부 찾을 수 있는 EnumWindows 을 활용해 창을 전부 조사한다. 이후 클래스 네임, 제목표시줄 등을 이용해 핸들값(HWND)을 얻는다. 얻은 핸들값에 대해 ShowWindow를 사용해서 최소화 복원을 하고, SetForegroundWindow를 사용해서 윈도우를 포커스한다.

찾는 법은 핸들의 클래스네임, 제목표시줄, x좌표 세 가지를 이용해 찾을 수 있다.

(1) 클래스네임으로 윈도우 찾기

HWND hwnd=m.getHwnd(“IEFrame”,null,null);

라고 쓰면 “IEFrame”, 즉 인터넷 익스플로러를 찾는다.

(2) 제목표시줄로 윈도우 찾기

HWND hwnd=m.getHwnd(null,”네이버”,null);

라고 쓰면 제목표시줄에 “네이버”라는 스트링이 포함된 창을 찾는다. indexOf를 사용했다.

(3) 창의 x좌표로 윈도우 찾기

HWND hwnd=m.getHwnd(null,null,500);

라고 쓰면 창의 x좌표가 500보다 같거나 큰 창을 불러온다. 만약 -500을 주면 500보다 같거나 작은 창을 불러온다.

주의할 점은 여러 개의 핸들이 해당되어도 단 한개의 핸들(HWND)만 리턴된다는 점이다. 그러므로 (1),(2),(3)의 조합을 섞어 사용하여 한 개의 핸들만 띄워질 수 있도록 해야 한다.

참고)showWindow

 

SW_HIDE 0 보이지 않도록 한다.

SW_SHOWNORMAL 1 윈도우를 보이도록 하되 최대화 or 최소화 되어있다면 원래상태로 되돌린다.

SW_SHOWMINIMIZED 2 윈도우를 활성화 하고 최소화 한다.

SW_MAXIMIZE 3 최대화 한다.

SW_SHOWNOACTIVATE 4 윈도우를 보이도록 하지만 활성화 하지 않는다.

SW_SHOW  5 윈도우를 보이도록 한다.

SW_MINIMIZE 6 최소화 한 후 이전 윈도우를 활성화한다.

SW_SHOWMINNOACTIVE 7 윈도우를 최소화 하지만 활성화 하지는 않는다.

SW_SHOWNA 8 윈도우를 보이도록 하지만 활성화 하지는 않는다.

SW_RESTORE 9 원 상태로 되돌린다.

SW_SHOWDEFAULT 10 윈도우 생성시의 Flag 값에 따라 설정합니다.

SW_FORCEMINIMIZE 11 최소화 한다.

package com;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;

public class MainClass {

 public static void main(String[] args) {
 MainClass m=new MainClass();
  
 HWND hwnd=m.getHwnd(null,”getnum2″,null);
 if(hwnd!=null){
  User32.INSTANCE.ShowWindow(hwnd,9);//최소화 되어있을 경우 복원
  User32.INSTANCE.SetForegroundWindow(hwnd);
 }
 else{
  System.out.println(“윈도우를 찾을 수 없습니다.”);
 }
 }
 
 
 
 public String wcls;
 public String wtitle;
 public static Integer wx;
 public static HWND res;

 public HWND getHwnd(String cls,String title, Integer x){

  res=null;
  wcls=cls;
  wtitle=title;
  wx=x;
 
  try{
   User32.INSTANCE.EnumWindows(new WNDENUMPROC() {
             int count = 0;

             public boolean callback(HWND hWnd, Pointer arg1) {
                 char[] windowText = new char[512];
                 User32.INSTANCE.GetWindowText(hWnd, windowText, 512);
                 String wText = Native.toString(windowText);
                 RECT rectangle = new RECT();
                 User32.INSTANCE.GetWindowRect(hWnd, rectangle);
                
                 //숨겨져 있는 창은 제외하고 찾는다. 최소화 되어있는 창은 포함한다.
                 //rectangle.left값이 -32000일 경우 최소화되어 있는 창이다.
                 if (wText.isEmpty() ||
                    !(User32.INSTANCE.IsWindowVisible(hWnd))) {
                    return true;
                 }
                
                 //핸들의 클래스 네임 얻기
                 char[] c=new char[512];
                 User32.INSTANCE.GetClassName(hWnd, c, 512);
                 String clsName=String.valueOf(c).trim();
                
                 //조건 세 개를 만족하면, 핸들을 돌려줌
                 int check=0;
                
                 //조건1: 요청 클래스네임이 널이거나, 클래스네임과 일치할 경우 체크를 증가
                 if(wcls==null){//”IEFrame”
                  check++;
                 }
                 else if(clsName.equals(wcls)){ //&& wcls!=null
                  check++;
                 }
                
                 //조건2: 제목표시줄이 널이거나, 원하는 글자가 포함되어 있다면 체크를 증가
                 if(wtitle==null){
                  check++;
                 }
                 else if(wText.indexOf(wtitle)>=0){
                  check++;
                 }
                
                 //조건3
                 if(wx==null){
                  //널이라면 안적은걸로 간주
                  check++;
                 }
                 else if(wx>0){
                  if(rectangle.left>=wx){
                   //wx가 500이라면  x좌표가 500 이상인 창만 합격
                   check++;
                  }
                 }
                 else if(wx<0){
                  if(rectangle.left<=(-wx)){
                   //wx가 -500이라면  x좌표가 500 이하인 창만 합격
                   check++;
                  }
                 }
                 //조건 3개를 충족했다면 핸들을 돌려줌
                 if(check==3){
                 res=hWnd;
                
                 System.out.println(
                          “hwnd:”+hWnd+”,”+
                          “번호:” + (++count) + “,텍스트:” + wText+”,”+
                          “위치:(“+rectangle.left+”,”+rectangle.top+”)~(“+rectangle.right+”,”+rectangle.bottom+”),”+
                          “클래스네임:”+clsName+”,”+
                          “상태:”+User32.INSTANCE.IsWindowVisible(hWnd));
                 }
                 return true;
             }
         }, null);
  
  }catch(Exception ex){System.out.println(ex.getMessage());}
 
  return res;
 
 }

}
 

작업표시줄 제목으로 윈도우 찾고 포커스하기 (FindWindow, SetForegroundWindow)

작업표시줄 제목으로 윈도우 찾고 포커스하기 (FindWindow, SetForegroundWindow)

기존의 방식은 (1)클래스 네임 또는 (2)제목표시줄로 윈도우 핸들을 얻고(FindWindow), 포커스를 하는(SetForegroundWindow) 방식이었다.

package com;

import java.awt.Robot;

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;

public class MainClass {

 public static void main(String[] args) {
  
  WinDef.HWND hWnd;//윈도우 핸들
  try{
     //로봇 선언
   Robot robot=new Robot();
 
   //메모장이 켜졌는지 검사
   hWnd=null;
   while(hWnd==null){
    System.out.println(“메모장을 찾는 중입니다”);
    robot.delay(500);
    //hWnd = User32.INSTANCE.FindWindow(“Notepad”, null);
    hWnd = User32.INSTANCE.FindWindow(null, “제목 없음 – 메모장”);
   }
   User32.INSTANCE.SetForegroundWindow(hWnd);
  }catch(Exception ex){System.out.println();}
 }
}

하지만 위 소스의 단점은 “제목 없음 – 메모장” 이라고 작업표시줄 상의 풀 네임을 정확히 적어야 한다는 것이었다.

아래는 이를 개선한 소스이다. 현재 띄워진 모든 창들을 가져온 후, indexof 를 활용하여 핸들을 얻는다.

이렇게 하면 “제목 없음 – 메모장”이라는 풀 네임이 아니라 “제목”, “제목 없”. “제목 없음”.. 만으로도 핸들을 찾을 수 있다.

package com;

import java.awt.List;
import java.awt.Robot;
import java.util.ArrayList;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.Netapi32Util.User;
import com.sun.jna.platform.win32.WinDef.HDC;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;

public class MainClass {

 public static void main(String[] args) {
  MainClass m=new MainClass();
  User32.INSTANCE.SetForegroundWindow(m.getHwndByName(“제목 없음”));
 }
 
 private String str=””;
 private HWND res=null;
 
 public String getStr() {
  return str;
 }
 public void setStr(String str) {
  this.str = str;
 }
 public HWND getRes() {
  return res;
 }
 public void setRes(HWND res) {
  this.res = res;
 }

 public HWND getHwndByName(String str){
  HWND res=null;
  setStr(str);
  
  try{
   User32.INSTANCE.EnumWindows(new WNDENUMPROC() {
             int count = 0;
             String str=””;
            
             public boolean callback(HWND hWnd, Pointer arg1) {
                 char[] windowText = new char[512];
                 User32.INSTANCE.GetWindowText(hWnd, windowText, 512);
                 String wText = Native.toString(windowText);
                 RECT rectangle = new RECT();
                 User32.INSTANCE.GetWindowRect(hWnd, rectangle);
                 // get rid of this if block if you want all windows regardless
                 // of whether
                 // or not they have text
                 // second condition is for visible and non minimised windows
                 if (wText.isEmpty() || !(User32.INSTANCE.IsWindowVisible(hWnd)
                         && rectangle.left > -32000)) {
                     return true;
                 }
                
                 //핸들의 클래스 네임 얻기
                 char[] c=new char[512];
                 User32.INSTANCE.GetClassName(hWnd, c, 512);
                 String clsName=String.valueOf(c).trim();

                 if(wText.indexOf(getStr())>=0){
                  //원하는 글자가 포함되어 있다면 핸들값을 set함
                  setRes(hWnd);
                  
                  System.out.println(
                          “hwnd:”+hWnd+”,”+
                          “번호:” + (++count) + “,텍스트:” + wText+”,”+
                          “위치:(“+rectangle.left+”,”+rectangle.top+”)~(“+rectangle.right+”,”+rectangle.bottom+”),”+
                          “클래스네임:”+clsName);

                 }
                 return true;
             }
         }, null);
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
  
  return getRes();
  
 }

}
 

[JAVA] JNA 실행중인 윈도우 핸들 모두 얻기(EnumWindows)

[JAVA] JNA 실행중인 윈도우 핸들 모두 얻기(EnumWindows)

현재 실행중인 모든 윈도우 핸들의 정보를 출력하는 JAVA JNA 코드.

Github 주소 : https://github.com/thkmon/BBShowAllHwndInfos.git

package com.thkmon.bbwin.main;

import java.util.ArrayList;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.ptr.IntByReference;

public class BBShowAllHwndInfos {
    privatestatic ArrayList<String> hwndInfoList = null;

    publicstaticvoid main(String[] args) {
        try {
            System.out.println(
“[INFORMATION OF CURRENT WINDOW HANDLES]”);
            System.out.println(
“”);
            
            hwndInfoList =
new ArrayList<String>();
            
            BBShowAllHwndInfos instance =
new BBShowAllHwndInfos();
            instance.printAllHwndInformations();
            
            int count = hwndInfoList.size();
            for (int i=0; i<count; i++) {
                System.out.print(
“(“ + (i+1) + “/” + count + “) “);
                System.out.println(hwndInfoList.get(i));    
            }
            
            System.out.println(
“END”);

        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            // wait for 10 minutes after run
            Thread.sleep(1000 * 60 * 10);
        }
catch (Exception e) {
            // ignore
        }
    }

    privatevoid printAllHwndInformations() throws Exception {
        try {
            User32.INSTANCE.EnumWindows(new WNDENUMPROC() {
                publicboolean callback(HWND hwnd, Pointer arg1) {
                    char[] windowText =
new char[512];
                    User32.INSTANCE.GetWindowText(hwnd, windowText, 512);
                    String wText = Native.toString(windowText);

                    RECT rectangle = new RECT();
                    User32.INSTANCE.GetWindowRect(hwnd, rectangle);

                    // 숨겨져 있는 창은 제외하고 찾기
                    if (wText.isEmpty() || !(User32.INSTANCE.IsWindowVisible(hwnd))) {
                        returntrue;
                    }
                    
                    // 최소화 여부
                    boolean bMinimized = false;
                    if (rectangle.left <= -32000) {
                        bMinimized =
true;
                    }

                    // 핸들(hwnd)의 클래스 네임 가져오기
                    char[] c = new char[512];
                    User32.INSTANCE.GetClassName(hwnd, c, 512);
                    String clsName = String.valueOf(c).trim();

                    // 핸들(hwnd)의 pid 가져오기
                    IntByReference pidByRef = new IntByReference(0);
                    User32.INSTANCE.GetWindowThreadProcessId(hwnd, pidByRef);
                    int pid = pidByRef.getValue();

                    StringBuilder buff = new StringBuilder();
                    buff.append(
“PID : “).append(pid);
                    buff.append(
“\n”).append(“CLASSNAME : “).append(clsName);
                    buff.append(
” / “).append(“TEXT : “).append(wText);
                    buff.append(
“\n”).append(“MINIMIZED : “).append(bMinimized);
                    buff.append(
” / “).append(“POSITION : (“).append(rectangle.left).append(“,”).append(rectangle.top).append(“)”);
                    buff.append(
“~(“).append(rectangle.right).append(“,”).append(rectangle.bottom).append(“)”);
                    buff.append(
“\n”);
                    
                    hwndInfoList.add(buff.toString());
                    
                    returntrue;
                }
            }, null);

        } catch (Exception e) {
            throw e;
        }
    }
}

결과 예시

[INFORMATION OF CURRENT WINDOW HANDLES]

(1/4) PID : 8164
CLASSNAME : SWT_Window0 / TEXT : BBShowAllWindowInfos – BBShowWindowInfos/src/com/thkmon/bbwin/main/BBShowWindowInfos.java – Eclipse
MINIMIZED : false / POSITION : (-8,-8)~(1928,1054)

(2/4) PID : 10056
CLASSNAME : IEFrame / TEXT : 글쓰기, 흑곰의 유익한 블로그 : 네이버 블로그 – Internet Explorer
MINIMIZED : false / POSITION : (101,442)~(1576,1258)

(3/4) PID : 5496
CLASSNAME : ConsoleWindowClass / TEXT : C:\WINDOWS\system32\cmd.exe
MINIMIZED : false / POSITION : (156,156)~(1149,675)

(4/4) PID : 14240
CLASSNAME : Chrome_WidgetWin_1 / TEXT : Google 번역 – Chrome
MINIMIZED : true / POSITION : (-32000,-32000)~(-31801,-31966)

END

윈도우핸들 클래스네임 얻기(GetClassName)

윈도우핸들 클래스네임 얻기(GetClassName)

public static void main(String[] args) {
  try{
   Robot robot=new Robot();
   robot.delay(100);
  
   WinDef.HWND hWnd;//윈도우 핸들

   hWnd=null;
  
   //핸들을 얻는다
   HWND h=User32.INSTANCE.GetForegroundWindow();
   System.out.println(h);
   char[] c=new char[1000];
  
   System.out.println(User32.INSTANCE.GetClassName(h, c, 1000));

   System.out.println(c);
  
  }catch(Exception ex){System.out.println(ex.getMessage());}
 }

///////예를 들면 아래와 같다.
이클립스 “SWT_Window0”
익스플로러 “IEFrame”
파워포인트2007 “PP12FrameClass”

파워포인트2003 “PP11FrameClass”

파워포인트2002 (PPT XP버젼) “PP10FrameClass”

파워포인트2000 “PP9FrameClass”

파워포인트97 “PP97FrameClass”

엑셀 “XLMAIN”

워드 “OpusApp”

메모장 “Notepad”

자바 클립보드

자바 클립보드

 

복사 하는 방법 (자바->클립보드)

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
 String copyString = textArea.getSelectedText();
 if(copyString != null)
 {
      StringSelection contents = new StringSelection(copyString);
      clipboard.setContents(contents, null);
 }

 

꺼내오는(붙여넣기) 방법 (클립보드->자바)

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
 Transferable contents = clipboard.getContents(clipboard);

if(contents != null)
 {

     try {
           String pasteString = (String)(contents.getTransferData(
 DataFlavor.stringFlavor));
           textArea.insert(pasteString, textArea.getCaretPosition());
      } catch (Exception e) {}

}

jna예제

jna예제

// jna-4.1.0.jar 와 같이 jna 자르파일이 필요함.

// jna는 자바 네이티브 액서스로 jni(자바 네이티브 인터페이스)보다 좀 더 접근이 용이함

package com;
import com.sun.jna.*;

interface MyUser32 extends Library {
 public int MessageBoxA(int handle, String message, String title, int type);

}
public class MainClass {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  String mytext = “Hello World!”;
        String mytitle = “Title bar”;

        String libName = “c”;

        if (System.getProperty(“os.name”).contains(“Windows”)) {
            libName = “user32”;
        }

        MyUser32 user32 = (MyUser32) Native.loadLibrary(libName, MyUser32.class);
        user32.MessageBoxA(0, mytext, mytitle, 0);
 }

}

//Dll 함수 API을 보고 파라메터에 해당하는 인자를 인터페이스로 만들어 사용하면 됨

자바매크로 (키보드후킹)

자바매크로 (키보드후킹)

출처: http://okky.kr/article/270141

okky.kr의 아이디 jeemin2 님이 작성하셨습니다.

————————————————

JAVA Robot – http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html

자바 공식지원 매크로 도구.
화면캡쳐, 키보드누르기, 마우스 움직이고 클릭 등등 매크로에 필요한 기능을 전부 제공한다.

Tasklist – http://technet.microsoft.com/en-us/library/bb491010.aspx

프로세스 정보를 출력하는 콘솔 명령어

XP이후부터 등장한 이녀석을 이용하면 간단한 프로세스 정보를 얻어올 수 있다. 자바의 콘솔실행 기능을 이용하면

new ProcessBuilder(“tasklist”, “/FI”, “\”IMAGENAME eq calc.exe\””).start(); 이런식으로 해서 계산기가 실행중인지 여부를 판단이 가능

NirCmd – http://www.nirsoft.net/utils/nircmd.html

콘솔명령어 도구.

마우스/키보드누른효과, 모니터 끄기/켜기, Alt-Tab기능, 딴창크기조절, CD-ROM열기 등등등 컴퓨터로 할 수 있는 거의 모든 기능을

콘솔명령어로 실행할 수 있게 해주는 녀석. 그러니까 콘솔창에서 “nircmd sendkeypress Shift+n” 이렇게 쳐주면

진짜로 키보드의 쉬프트+N키를 누른 효과가 나오는 녀석…

한마디로 자바에서 new ProcessBuilder(“nircmd.exe”, “win”, “activate”, “calc.exe”).start(); 이런식으로 계산기 창을 최상위로

올린다던가 하는 상세한 제어를 할 수 있게 된다.

Open CV for JAVA – http://opencv.org/

유명한 이미지 처리기.

얼마전부터 정식으로 자바를 지원하기 시작해서 고도의 이미지 처리를 자바에서 자유자재로 할 수 있게 되었다.

덕분에 Imgproc.matchTemplate(img1, img2, img3, Imgproc.TM_CCOEFF_NORMED); 요렇게 한줄만 해줘도

이미지가 엄청난 속도로 패턴검색이 되어 미리 저장해둔 패턴이 현재 화면에 존재하는지, 그리고 위치가 어딘지까지 찾아올 수있다.

즉 특정버튼을 미리 캡쳐해 놨다가 자동으로 클릭하는 기능같은것도 순식간에 만들수 있다는 이야기.

JNativeHook – https://github.com/kwhat/jnativehook

자바 글로벌 후킹 도구.

시스템 자체를 후킹해서 사용자가 입력하는 모든 키보드, 마우스이동, 클릭좌표 등의 정보를 자바로 가져올 수 있게 해준다.

자바커에게 익숙한 이벤트 방식으로 동작하기에 아주 편하게 쓸 수 있다.

그외 기타 꼼수들

클립보드

Toolkit.getDefaultToolkit().getSystemClipboard();

이런식으로 하면 현재 클립보드에 복사되어 있는 내용을 자바로 가져올 수 있다.

현재 커서 위치의 문자열을 자바로 읽어오기 귀찮을땐, Robot으로 강제로 Ctrl+C를 누른 효과를 줘버리고 클립보드에서 가져오면 편하다.

기본 프로그램 실행

Desktop.getDesktop().open(new File(“abcd.xls”));

이런식으로 해주면 그냥 알아서 엑셀이 실행된다. 설치 여부를 검사하거나 Programs Files뒤질 필요없이 해당 파일에 연결된

시스템 기본 프로그램이 그냥 알아서 실행된다.

기본 브라우져로 URL열기

Desktop.getDesktop().browse(new URI(“http://www.naver.com“));

이런식으로 해주면 시스템 기본 브라우져가 알아서 실행되며 지정한 페이지가 열린다.

매크로상 외부와 통신해야 한다면 귀찮게 소켓통신이나 DB연결 할 필요없이 웹기반으로 통신하면 편하다.

파싱기본

파싱기본

try{

URL url = new URL(“http://www.naver.com“);

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

String iline=””;

while ((iline = in.readLine()) != null)

System.out.println(iline);

in.close();    

}catch(Exception ex){System.out.println(ex.getMessage());}

XML, Annotation, SPRING, HADOOP, JQuery 총정리

XML, Annotation, SPRING, HADOOP, JQuery 총정리

XML

    문서 저장 언어(반정형화)

    => 호환성 (모바일, 운영체제)

    => 파싱(DOM, SAX, JAXB(OXM):XML,JSON모두 포함)

Annotation: 구분문자

    <구분의 범위>

    TYPE : 클래스 구분

    METHOD : 메소드 구분

    FIELD : 멤버변수 구분

    PARAMETER: 매개변수 구분

SPRING: 의존성이 약한 프로그램

    =<Container의 종류> : Component 관리자(사용자 정의 클래스)

    BeanFactory

    ApplicationContext

    AnnotationConfigApplicationContext

    GenericApplicationContext

    WebApplicationContext

    = DI, DL

    = AOP (Transaction, Security)

    = MVC (Tiles)

        = DispatcherServlet

        = @Controller

          @RequestMapping

          @ResponseBody

          @PathVariable

    = ORM (MyBatis)

HADOOP

    = 설치 (의사/가상 모드, Full Mode)

    = Map/Reduce

    = Mongodb

    = hive

    = hbase

    = zookeeper

    

    = spring에서 hadoop연결

    = 하둡에서 jar구동

JQuery : 자바스크립트 라이브러리

    선택자 $(선택자. css와 유사).이벤트

   #으로 id 찾기, .(점)으로 class 찾기

Angular JS

JSP 총정리

JSP 총정리

1) 지시자

    = page : contentType, import

    = taglib : prefix, uri

    = include : file=”” (정적)

    <%@ include %> : JSP+JSP (소스가 묶인다. 같은 변수를 쓰면 에러가 난다)

    <jsp:include> : HTML+HTML (결과페이지가 묶인다)

2) JSP 사용법

    <% %> : 스크립트릿(자바코딩)

    <%= %> : 표현식

    <%! %> : 선언식(메소드, 멤버변수)

3) 자바빈즈 :

    DTO (데이터빈)

    DAO (액션빈)

4) 자바빈 제어 : 액션태그

    <jsp:useBean>

    <jsp:setProperty>

    <jsp:getProperty>

5) 데이터베이스 연결

    = DAO
    = DBCP(데이터베이스 커넥션풀) : 이름을 갖고 가져오는 JNDI(자바네이밍디렉토리 인터페이스)를 씀 => 스프링에선 DL(디펜젼시 룩업)

6) MVC

프레젠테이션과 비즈니스 로직이 분리됨

오라클 총정리

오라클 총정리

2. Oracle

    DML:

        1) SELECT

            연산자

                = IS NULL, IS NOT NULL (NULL 연산자. null인 값은 인덱스를 만들지 않는게 좋다)

                = BETWEEN ~ AND ( >= and <= )

                = LIKE (% , _ )

                = IN => OR

            내장함수

                = 문자열, SUBSTR, INSTR, RPAD, LENGTH

                = 숫자: MOD, ROUND, TRUNC

                = 날짜: SYSDATE, MONTHS_BETWEEN

                = 변환: TO_CHAR

                = 기타: NVL

                = 그룹: COUNT, MAX, MIN, AVG, SUM

            JOIN

                INNER JOIN

                = EQUI JOIN

                    (NATURAL JOIN, JOIN~USING)

                = NON-EQUI JOIN

                OUTER JOIN

                = LEFT OUTER JOIN

                = RIGHT OUTER JOIN

            SubQuery

                = 단일행 main-query = (subquery)

                = 다중행 IN, ANY, ALL => MAX, MIN

        2) INSERT

        3) UPDATE

        4) DELETE

   DDL: CREATE, DROP, ALTER(MODIFY, DROP, ADD)

   DCL: GRANT, REVOKE

   TCL: COMMIT, ROLLBACK

VIEW: 보안, 쿼리문장을 단순화

         => INLINE VIEW

SUBQUERY를 쓰는 위치: SELECT (SELECT ~),

                                    FROM (SELECT)

                                 => 서브쿼리가 Column이나 Table을 대체할 수 있다.

SEQUENCE => 자동 증가번호

PROCEDURE => SQL 중복, SQL 문장을 감출 경우

TRIGGER

제약조건

    = PRIMARY KEY : 중복비허용, NULL비허용 (UNIQUE+NOT NULL)
    = FOREIGN KEY

    = UNIQUE : 중복비허용, NULL허용

    = CHECK

    = NOT NULL => DEFAULT

자바 총정리

자바 총정리

 *   1. 자바 (1.7~1.8)
 *    1.8에 증가된 내용
 *    1) 람다식 ()->{구현}  (파이썬,C#) : 오라클(파이썬, C)
 *    2) Nashorn : 자바스크립트 엔진
 *    3) NIO (입출력)
 *    4) 프로젝트 내에서 중복 제거, 관리 => 직소
 *   
 *   2. 자바
 *    변수(데이터형: int, byte, long, double, String, boolean), 상수
 *    배열(일차원 배열), 제어문(if,for,while,switch-case,break,continue)
 *    클래스: POJO(상속이나 구현이 없다. 사용자 정의때문에 쓴다. 제한 없이 프로그래머 마음대로 사용할 수 있기 때문)
 *     => 추상클래스 VS 인터페이스
 *        : 사용목적 = 서로 다른 클래스를 모아서 관리
 *     *변수를 모아 관리->배열
 *     *클래스를 모아 관리->인터페이스
 *      extends, implements=>동일한 클래스형으로 변환
 *      => instanceof
 *     => 익명의 클래스: 람다식
 *           => 메소드
 *       : 반복수행(재사용) => CallBack(AOP) 자바에서는 메인클래스, 이벤트(액션퍼폼드), 서블릿의 두겟/두포스트
 *       : 한 가지 기능만 수행
 *              => 변수
 *                 1) instance
 *                 2) static
 *               ==============================
 *                method영역, static
 *               ==============================
 *                stack(지역변수, 매개변수):메모리 관리 영역
 *               ==============================
 *                heap(new): 프로그래머가 관리 -> GC
 *                  new => malloc(sizeof(10))
 *                  delete => free()
 *               ==============================
 *              
 *  3. 객체 지향의 기능
 *   1) 캡슐화: 데이터 보호
 *         캡슐화 VS 은닉화
 *         (게터세터) (프라이빗)
 *     2) 상속(변경해서 쓴다): 재사용 => 포함(있는 그대로 쓸 때)
 *        ===            ===
 *     3) 오버라이딩 VS 오버로딩 : 다형성
 *        =======  ======
 *      modify   new
 *  
 *    4. 예외처리
 *     : 비정상 종료를 방지하고 현재 실행상태 유지

람다식 기초2

람다식 기초2

 interface My{
  public void a(int a,int b);
 }
 public static void main(String[] args) throws Exception {
  My m=(x,y)->{System.out.println(x+y);};
  m.a(10,20);
 }

—> 30 이 출력됨

——————————————————————————–

 public static void main(String[] args) throws Exception {

  System.out.println(“1.익명의 클래스”);
  new Thread(){
   public void run(){
    try{
     Thread.sleep(1000);
     System.out.println(“1시간:”+System.currentTimeMillis());
    }catch(Exception ex){}
   }
  }.start();
  
  
  ///////////////////////////////////////////
  System.out.println(“2.람다식 표현”);
  new Thread(()->{
   try{
    System.out.println(“2시간:”+System.currentTimeMillis());
   }catch(Exception ex){}
  }).start();

 }

나즈혼(Nashorn)

 

나즈혼(Nashorn)

 

 public static void main(String[] args) throws Exception {
  ScriptEngine se= new ScriptEngineManager().getEngineByName(“nashorn”);
       se.eval(new FileReader(“C:\\Spring\\workspace\\NashornPorject\\src\\myScript.js”));
       // Java + JavaScript Method 통신
      
       Invocable in = (Invocable)se;
       Object result = in.invokeFunction(“func1”, “Hong Gil Dong”);
       System.out.println(result);
 }

myScript.js

var func1=function(name){
 print(“Hi!”+name);
 return “Test NasHorn”;
}

람다식 기초

람다식 기초

interface A{
  public void display();
 }
 public static void main(String[] args) {
  A a=new A(){
   public void display(){
    System.out.println(“A:Display() Call”);
   }
  };

  a.display();
  ////////////////////////////////////////////////////////
  a=()->{System.out.println(“A:람다식표현”);};
  a.display();
 }

총요약

총요약

SRPING

DI

AOP

Transaction

Security

=> Tiles

=> ORM

=> OXM

=> Hadoop, MongoDB

=> Container

=> MVC

자바

=> 변수, 연산자, 제어문

=> 객체지향 프로그램
1) 메소드

2) 클래스 (종류)

= 일반 클래스

= 추상 클래스

= 익명의 클래스

Oracle

= DML, DDL, DCL, TCL

= JOIN, SUBQUERY

= 제약조건, 테이블명 변경, 수정

= Procedure

= Trigger

= Sequence

= View

= Index

JSP

SPRING

HADOOP

XML

JSON

Annotation

MyBatis

람다식

자바1.7

A a=null;
a=new A(){
  public void display(){
    System.out.println(“aaa”); 
  }
}

람다식(1.8)

A a=null;
a+()->{System.out.println(“aaa”);};
a.display();

instanceof

instanceof

클래스들의 크기를 비교한다.

여기서 할아버지(인터페이스) – 아버지(클래스)- 아들(클래스)가 있다고 가정한다.

다음과 같은 결과가 나온다.

1. 아들은 아버지의 인스턴스이다 (참)

2. 아들은 할아버지의 인스턴스이다 (참)

3. 아버지는 할아버지의 인스턴스이다 (참)

여기까지는 너무나 당연하다.

4. 할아버지에 아버지를 오버라이딩한 클래스는, 할아버지의 인스턴스이다 (참)
5. 할아버지에 아버지를 오버라이딩한 클래스는, 아버지의 인스턴스이다 (참)

6. 할아버지에 아버지를 오버라이딩한 클래스는, 아들의 인스턴스이다 (거짓)

※ 참고) 할아버지에 아버지를 오버라이딩한 클래스 : 할아버지 a=new 아버지();

7. 아버지에 아들을 오버라이딩한 클래스는, 할아버지의 인스턴스이다 (참)
8. 아버지에 아들을 오버라이딩한 클래스는, 아버지의 인스턴스이다 (참)
9. 아버지에 아들을 오버라이딩한 클래스는, 아들의 인스턴스이다 (참)

※ 참고) 아버지에 아들을 오버라이딩한 클래스 : 아버지 a=new 아들();

——————————————————————————————————–

interface GF{};
class F implements GF{};
class S extends F{};

public class MainClass {

 public static void main(String[] args) {
  F f=new F();
  S s=new S();
  
  if(s instanceof F){
   System.out.println(“1. 아들은 아버지의 인스턴스이다”);//TRUE
  }
  if(s instanceof GF){
   System.out.println(“2. 아들은 할아버지의 인스턴스이다”);//TRUE
  }
  if(f instanceof GF){
   System.out.println(“3. 아버지는 할아버지의 인스턴스이다”);//TRUE
  }

  
  GF a1=new F();
  F a2=new S();
  
  if(a1 instanceof GF){
   System.out.println(“4. 할아버지에 아버지를 오버라이딩한 클래스는, 할아버지의 인스턴스이다”);//TRUE
  }
  if(a1 instanceof F){
   System.out.println(“5. 할아버지에 아버지를 오버라이딩한 클래스는, 아버지의 인스턴스이다”);//TRUE
  }
  if(a1 instanceof S){
   System.out.println(“6. 할아버지에 아버지를 오버라이딩한 클래스는, 아들의 인스턴스이다(거짓)”);//FALSE
  }

  if(a2 instanceof GF){
   System.out.println(“7. 아버지에 아들을 오버라이딩한 클래스는, 할아버지의 인스턴스이다”);//TRUE
  } 
  if(a2 instanceof F){
   System.out.println(“8. 아버지에 아들을 오버라이딩한 클래스는, 아버지의 인스턴스이다”);//TRUE
  }
  if(a2 instanceof S){
   System.out.println(“9. 아버지에 아들을 오버라이딩한 클래스는, 아들의 인스턴스이다”);//TRUE
  }
  

 }
 
}

 

Angular JS 밸리데이션

Angular JS 밸리데이션

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd“>
<html>
<head>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
 <form method=”post” action=”j_spring_security_check”>
 login
 ID:<input type=”text” name=”j_username” size=”15″ ng-model=”j_username” ng-required=”true”>
 PWD:<input type=”password” name=”j_password” size=”15″ ng-model=”j_password” ng-required=”true”>
 
 <input type=”submit” value=”로그인”>
 </form>
</body>
</html>

전화번호만 구분해내는 밸리데이션

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd“>
<html>
<head>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body ng-app>
 <form name=”myForm” method=”post” action=”j_spring_security_check”>
  <input type=”text” name=”t2″
  placeholder=”패스워드” ng-model=”user.password” ng-required=”true”
  ng-pattern=”/^\d{3}-\d{3,4}-\d{4}$/”/>
  <div ng-show=”myForm.t2.$error.pattern”>전화번호 형식으로 써주십시오</div>
 
  <input type=”submit” value=”로그인” ng-click=”submit()”
  ng-disabled=”myForm.t2.$dirty && myForm.t2.$invalid”>
 </form>
</body>
</html>

Angular JS 2

Angular JS 2

data-ng-bind

<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
</head>
<body>
 <div ng-app ng-init=”name=’Hong Gil Dong'”>
  <p>Name:<span data-ng-bind=”name”></span></p>
 </div>
</body>
</html>

계산기

<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
</head>
<body>
 <div ng-app>
 입력1: <input type=”number” ng-model=”f”><br>
 입력1: <input type=”number” ng-model=”s”><br>
   <p>결과:{{f+s}}</p>
   <p>결과:{{f*s}}</p>
 </div>
</body>
</html>

JSON 형식과 ng-repeat(for문과 같음)

<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
</head>
<body>
 <div ng-app ng-init=”sawons=[{sabun:1,name:’홍길동’},{sabun:2,name:’심청이’},{sabun:3,name:’박문수’}]”>
   <ul>
    <!– for(Sawon s:sawons) –>
        <!– BasicDBObject –>
  <li ng-repeat=”sa in sawons”>
   {{sa.sabun}},{{sa.name}}
  </li>
   </ul>
 </div>
</body>
</html>

오라클 연결해서 앵귤러js rg-repeat로 뿌리기

<%@page import=”java.sql.ResultSet”%>
<%@page import=”java.sql.PreparedStatement”%>
<%@page import=”java.sql.DriverManager”%>
<%@page import=”java.sql.Connection”%>
<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
   
<%
 String data=””;

 try{
  Class.forName(“oracle.jdbc.driver.OracleDriver”);
  String url=”jdbc:oracle:thin:@localhost:1521:ORCL”;
  Connection conn=DriverManager.getConnection(url,”scott”,”tiger”);
  String sql=”SELECT empno,ename,job FROM emp”;
  PreparedStatement ps=conn.prepareStatement(sql);
  ResultSet rs=ps.executeQuery();
  data=”[“;
  while(rs.next()){
   data+=”{empno:”+rs.getInt(1)+”,ename:'”+rs.getString(1)+”‘,job:'”+rs.getString(2)+”‘},”;
  }
  data=data.substring(0,data.lastIndexOf(‘,’));
  data+=”]”;
  System.out.println(data);
 }catch(Exception ex){
  System.out.println(ex.getMessage());
 }
%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd“>
<html>
<head>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
 <div ng-app ng-init=”emp=<%=data%>”>
  <table border=1 width=350>
   <tr>
    <th>순번</th>
    <th>사번</th>
    <th>이름</th>
    <th>직위</th>
   </tr>
   <tr ng-repeat=”e in emp”>
    <td>{{$index}}</td>
    <td>{{e.empno}}</td>
    <td>{{e.ename}}</td>
    <td>{{e.job}}</td>
   </tr>
  </table>
 </div>
</body>
</html>

 

Angular JS 기초

Angular JS 기초

라이브러리 로드
 적용범위 지정 : ng-app
 데이터 초기화 : ng-init
 주입(데이터) : ng-model
 ============ MVC, MVVC, 지시자, Injection => JSON
 
 {{}}
 
 ${}
 
 = c:forEach = ng-repeat
 
 $scope, $http
 
 var names=[{no:1,name:”aaa”},{no:2,name:”bbb”},{no:3,name:”ccc”}]
 <p ng-repeat=”name in names”>  받는변수 in 기존변수
   {{name.no}}{{name.name}}
 

——————————-

html 문서를 아래와 같이 만들자.

인풋박스에 텍스트를 입력하면 아래 div에 그대로 출력되는 앵귤러js임.

<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>

<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js“>
</script>
</head>
<body>
 <div ng-app>
  <p>Name:<input type=text size=20 ng-model=”name”></p>
  <p ng-bind=”name”></p>
  <p></p>
 </div>
</body>
</html>

자바 1.7과 1.8의 차이, 스프링 3.0과 4.0의 차이

자바 1.8
=>직소
=>나즈혼(자바에서 자바스크립트 연동)
=>람다식(기호를 이용해서 접근)
=>동시성(스트림)

스프링 4.0
=>커뮤니티 (웹소켓)
=>그래들 (메이븐)
=>보안, JPA
 

REST방식

REST방식

많은 API(Application Programming Interface)들이 REST(Representational State Transfer)방식을 사용하고 있다. 주소값을 넘겨주면 파라미터 값에 맞춰 그에 맞는 xml을 넘겨주는게 REST방식이다.

*API: 특정 시스템에 대한 프로그래밍을 위한 함수의 집합

R eval (자바에서 R 결과값 받기)

R eval (자바에서 R 결과값 받기)

아래의 rc는 Rconnection임.

rc.voidEval (“x<-c(1,2,3,4,5)”);

REXP temp=rc.Eval(“x”);

String str=temp.asString();

이렇게하면 str에 벡터 x 의 값이 들어옴.

인풋박스 엔터인식(제이쿼리)

인풋박스 엔터인식(제이쿼리)

  $(‘#findstr’).keypress(function(event){
  var keycode=(event.keyCode?event.keyCode:event.which);
  if(keycode==’13’){
   mMovebyWord();
  }
  //event.stopPropagation();
 });