개발 등/고급
콘솔창 구현 소스(리눅스 버젼)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KonsoleFrame extends JFrame{
JTextArea ta;
JScrollPane jsp;
KonsoleFrame() {
init();
setDefaultCloseOperation(3);
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
ta.addKeyListener(new KeyExe(this));
ta.addMouseListener(
new MouseAdapter(){
public void mouseClicked(MouseEvent me){
ta.select(ta.getText().length(), ta.getText().length());
}
public void mouseReleased(MouseEvent me){
ta.select(ta.getText().length(), ta.getText().length());
}
}
);
}
public void init() {
ta = new JTextArea();
jsp = new JScrollPane(ta);
ta.setLineWrap(true);
getContentPane().add(jsp);
}
public static void main(String args[]) {
KonsoleFrame f = new KonsoleFrame();
f.setBounds(300, 300, 600, 500);
f.setVisible(true);
}
}
2. KeyExe
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class KeyExe implements KeyListener{
Execute exe;
KonsoleFrame kf;
private static final String P_FIRST = "[root@localhost ";
private static final String P_LAST = "]#";
// 전체 텍스트 문자열의 길이
private int startNum;
//절대경로 이름
String path;
KeyExe(KonsoleFrame kf) {
this.kf = kf;
try{
File file = new File(".");
path = file.getCanonicalPath();
}catch(Exception e){ e.printStackTrace();}
exe = new Execute(this);
kf.ta.append(P_FIRST+path+P_LAST);
//커서의 위치를 문장 끝으로 선택되게 한다.
kf.ta.select(kf.ta.getText().length(), kf.ta.getText().length());
//문자열 길이의 초기값.
startNum = P_FIRST.length() + path.length() + P_LAST.length();
}
public void keyPressed(KeyEvent ke) {
/*
* 백스페이스 키나 Del 키를 눌렀을 경우, 문자열의 길이와 같거나 작을 경우
* 삭제가 되지 않게 한다.
*/
if(ke.getKeyChar()=='\b' || ke.getKeyCode()==127){
if(kf.ta.getSelectionEnd() <= startNum)
kf.ta.setEditable(false);
}
}
public void keyReleased(KeyEvent keyevent){}
public void keyTyped(KeyEvent ke) {
kf.ta.setEditable(true);
/*
* 명령문을 받기 위해 스트링배열을 선언한다.
* 해당 이벤트들은 모두 Enter 키를 눌렀을 때 발생한다.
*/
String vt[] = new String[3];
if(ke.getKeyChar() == '\n'){
String str = kf.ta.getText();
//TextArea의 문자열을 얻어 온 후 새로운 명령문만 따로 추출해서 구분한다.
String v = str.substring(str.lastIndexOf("#") + 1, str.length());
if(v.length() > 1) {
StringTokenizer st = new StringTokenizer(v);
for(int i = 0; st.hasMoreTokens(); i++)
vt[i] = st.nextToken();
if(vt[0].equals("cd"))
exe.exeCd(path+"/"+vt[1]);
else if(vt[0].equals("dir") || vt[0].equals("ls")){
if(vt[1] == null)
vt[1] = ".";
Vector<String> files = exe.exeDir(path+"/"+vt[1]);
for(String s : files)
kf.ta.append(s+"\n");
}else if(vt[0].equals("gedit")){
//gedit - 한 단어면 프로그램 실행만 시킨다.
if(vt[1] == null)
exe.exeEdit(vt[0]);
//gedit 파일명 - 두 단어만 입력되면 패스명을 삽입한 후 exec를 실행한다.
else if(vt[2] == null)
exe.exeEdit(vt[0]+" "+path+"/"+vt[1]);
//gedit 경로명 파일명 - 세 단어가 입력되면 절대경로에 경로명을 더한 후 파일명과 함께 exec를 실행한다.
else
exe.exeEdit(vt[0]+" "+path+"/"+vt[1]+" "+vt[2]);
} else if(vt[0].equals("java")){
//java 단독 실행이 아닐 경우 경로명을 함께 매개변수로 넘겨 exec를 실행한다,
if(vt[1] == null)
exe.exeJava(vt[0]);
else
if(vt[2] == null)
exe.exeJava(vt[0]+" "+path+"/ "+vt[1]);
else
exe.exeJava(vt[0]+" "+path+"/"+vt[1]+" "+vt[2]);
} else if(vt[0].equals("javac"))
if(vt[1] == null && vt[2] == null)
exe.exeJavac(vt[0]);
else
exe.exeJavac(vt[0]+" "+path+"/"+vt[1]);
}
kf.ta.append(P_FIRST+path+P_LAST);
startNum = kf.ta.getText().length();
}
}
}
3. Execute
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
public class Execute{
private KeyExe ke;
Execute(KeyExe ke) {
this.ke = ke;
}
/*
* path를 매개변수로 받아 File클래스를 생성한다.
* isDirectory()와 exists()를 호출한 후 둘 다 참일 경우 getCanonicalPath()를 통해
* KeyExe 멤버변수인 path를 재설정한다.
*/
public void exeCd(String path){
String p = path;
File file = new File(p);
try {
boolean result1 = file.isDirectory();
boolean result2 = file.exists();
if(result1 && result2)
ke.path = (new File(p)).getCanonicalPath();
else
ke.kf.ta.append("Cannot find such Directory!"+"\n");
} catch(Exception e){ e.printStackTrace();}
}
/*
* path를 매개변수로 받은 다음 File List 배열을 구한다.
* 그런 다음 각 File의 정보를 받아온다.
*/
public Vector<String> exeDir(String path){
String p = path;
File file = new File(p);
// 각 파일의 정보를 담을 벡터를 생성한다.
Vector<String> v = new Vector<String>();
// 파일이 존재하는 지 검사한다.
boolean result = file.exists();
try{
if(result==true){
File[] fs = file.listFiles();
int i = 0;
// 순환문을 이용해서 각 파일의 정보를 벡터에 담는다.
for(File f : fs){
String name = f.getName();
String kind = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String size = f.length()+" bytes";
if(f.isDirectory())
kind = "<DIR>";
v.add(sdf.format(new Date(f.lastModified()))+'\t'+kind+'\t'+size+'\t'+name);
}
}else{ ke.kf.ta.append("Cannot not find directory"+"\n"); }
}
catch(Exception e){
e.printStackTrace();
}
return v;
}
/*
* gedit // gedit 파일명 // gedit 경로명 파일명
* 으로 각각 구분해서 처리한다.
*/
public void exeEdit(String path){
Vector<String> str = new Vector<String>();
for(StringTokenizer st = new StringTokenizer(path);st.hasMoreTokens();str.add(st.nextToken()));
if(str.size() == 1)
try{
Runtime.getRuntime().exec(str.get(0));
}catch(IOException e){ e.printStackTrace();}
else if(str.size() == 2)
try{
Runtime.getRuntime().exec(str.get(0)+" "+str.get(1));
}catch(Exception e){ e.printStackTrace(); }
else if(str.size() == 3)
try{
Runtime.getRuntime().exec(str.get(0)+" "+str.get(1)+" "+str.get(2));
}catch(Exception e){ e.printStackTrace(); }
}
public void exeJava(String path){
// java || java 경로명 파일명 으로 구분해서 처리한다,
Vector<String> str = new Vector<String>();
for(StringTokenizer st = new StringTokenizer(path); st.hasMoreTokens(); str.add(st.nextToken()));
if(str.size() == 1)
try {
Process pc = Runtime.getRuntime().exec(str.get(0));
BufferedReader br1 = new BufferedReader(new InputStreamReader(pc.getInputStream()));
for(String s = null; (s = br1.readLine()) != null;ke.kf.ta.append(s+"\n"));
br1.close();
} catch(Exception e) { e.printStackTrace(); }
else
if(str.size() == 3)
// java -classpath 경로명 파일명 으로 구분해서 처리한다.
// 에러문도 따로 처리한다.
try {
Process pc = Runtime.getRuntime().exec(str.get(0)+" -classpath "+str.get(1)+" "+str.get(2));
BufferedReader br1 = new BufferedReader(new InputStreamReader(pc.getInputStream()));
BufferedReader br2 = new BufferedReader(new InputStreamReader(pc.getErrorStream()));
for(String s1=null;(s1 = br1.readLine()) != null;ke.kf.ta.append(s1+"\n"));
for(String s2=null;(s2 = br2.readLine()) != null;ke.kf.ta.append(s2+"\n"));
br1.close();
br2.close();
}catch(Exception e) { e.printStackTrace(); }
}
public void exeJavac(String path) {
Vector<String> str = new Vector<String>();
for(StringTokenizer st = new StringTokenizer(path); st.hasMoreTokens(); str.add(st.nextToken()));
if(str.size() == 1)
try{
Process pc = Runtime.getRuntime().exec(str.get(0));
BufferedReader br = new BufferedReader(new InputStreamReader(pc.getErrorStream()));
for(String str2=null;(str2 = br.readLine()) != null;ke.kf.ta.append(str2+"\n"));
br.close();
}catch(Exception e){ e.printStackTrace(); }
else
try{
Process pc = Runtime.getRuntime().exec(str.get(0)+" "+str.get(1));
BufferedReader br1 = new BufferedReader(new InputStreamReader(pc.getInputStream()));
BufferedReader br2 = new BufferedReader(new InputStreamReader(pc.getErrorStream()));
for(String str1=null;(str1 = br1.readLine()) != null;)
ke.kf.ta.append(str1+"\n");
for(String str2=null;(str2 = br2.readLine()) != null;)
ke.kf.ta.append(str2+"\n");
br2.close();
br1.close();
} catch(Exception e) { e.printStackTrace(); }
}
}
'개발 등/고급'의 다른글
- 현재글콘솔창 구현 소스(리눅스 버젼)