Computer/Java

Cyworld Today Counter Hack ver2.0(GUI Version) by DogBull

DogBull 2006. 7. 23. 13:03

이번에는 GUI로 만들어 보았다.
특별히 달라진 기능은 존재하지 않는다.
실행파일로 제작해 보는 연습삼아 몇타 두드려 보았다.

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;


public class cyworld extends JFrame{
  JTabbedPane    pane=    new JTabbedPane();

  public cyworld(){
       this.setSize(getPreferredSize());
       this.setResizable(false);

       JPanel panel;

       this.setLayout(new BorderLayout());
      
       panel=    new PanelIndex(this);
       pane.addTab("Index", panel);

       panel=    new PanelUsage();
       pane.addTab("Usage", panel);

       panel=    new PanelAbout();
       pane.addTab("About", panel);

       pane.setSelectedIndex(0);

       this.getContentPane().add(pane,"Center");
       this.pack();

       this.addWindowListener(new WindowAdapter(){
           public void windowClosing(WindowEvent we){
               System.exit(0);
           }
       });
  }

  public Dimension getPreferredSize(){
       return new Dimension(200, 200);
  }

  public static void main(String args[]){
       cyworld    cyworld=    new cyworld();

       cyworld.pack();
       cyworld.setVisible(true);
  }
};

//가장 중심이되는 패널이다. 실제 업카운팅 구문이 이 패널안에 있다.
class PanelIndex extends JPanel implements ActionListener, Runnable{
  JLabel        label1=        new JLabel("Input Yout tid plz: ");
  JLabel        label2=        new JLabel("Print Message");
  JTextField    inTid=        new JTextField();
  JButton        btnStart=    new JButton("Start");
  JButton        btnStop=    new JButton("Stop");
  TextArea    taPrint=    new TextArea(5, 10);

  GridBagLayout        gbl=    new GridBagLayout();
  GridBagConstraints    gbc=    new GridBagConstraints();

  childWindow    chWindow;
  Thread    cThread;

  public PanelIndex(JFrame f){
       chWindow=    new childWindow(f);
       gbc.weightx=1.0;
       gbc.weighty=1.0;
       gbc.fill=    GridBagConstraints.BOTH;

       btnStart.addActionListener(this);
       btnStop.addActionListener(this);

       this.setLayout(gbl);

       this.add(0, 0, 1, 1, label1);
       this.add(0, 1, 1, 1, inTid);
       this.add(1, 1, 1, 1, btnStart);
       this.add(1, 1, 1, 1, btnStop);
       this.add(0, 2, 2 ,1, label2);
       this.add(0, 3, 2, 1, taPrint);

       cThread=    new Thread(this);
  }

  public void add(int x, int y, int w, int h, Component c){
       gbc.gridx=        x;
       gbc.gridy=        y;
       gbc.gridwidth=    w;
       gbc.gridheight=    h;

       add(c, gbc);
  }

  public void actionPerformed(ActionEvent ae){ //버튼에 이벤트 발생시 호출됨.
       JButton    jb=    (JButton)ae.getSource();

       if(inTid.getText().length()==8){
           try{
               if(jb.equals(btnStart)){//실행 버튼을 눌렀을때
                   if(cThread==null){
                       cThread=    new Thread(this);
                   }
                   cThread.start();

                   taPrint.append("카운터 시작됨.\n");

                   btnStop.setVisible(true);
                   btnStart.setVisible(false);
               }else{//실행 버튼을 눌렀을때가 아는 즉 stop버튼 눌렀을때.
                   cThread.stop();
                   cThread=null;

                   taPrint.append("카운터 정지됨.\n");

                   btnStart.setVisible(true);
                   btnStop.setVisible(false);
               }
           }catch(Exception e){
               chWindow.show("치명적 에러 발생.");
           }
       }else{
           System.out.println(inTid.getText());
           chWindow.show("tid 값이 올바르지 않음");
       }
  }


  String        urlStr=    "http://minihp.cyworld.nate.com/pims/main/pims_main4.asp?tid=";
  String        myUrl=    "http://minihp.cyworld.nate.com/pims/main/pims_main4.asp?tid=24631766";
  int            count=0;

  public void run(){
       try{
           while(true){
               URL                url=    new URL(urlStr);
               URLConnection    con=    url.openConnection();
               InputStream        is=        con.getInputStream();
              
               if(con.toString().endsWith("limit=0") || con.toString().endsWith("limit=1")){
                   taPrint.append("매크로 에러에 걸림!\n");
                   break;
               }
               count++;
               taPrint.append("Count: "+Integer.toString(count)+"\n");
               Thread.sleep(7000);

               //제작자 방문.
               URL                url2=    new URL(myUrl);
               URLConnection    con2=    url2.openConnection();
               InputStream        is2=    con2.getInputStream();

               Thread.sleep(7000);
           }
       }catch(Exception e){}
  }

};

class PanelUsage extends JPanel{
  public PanelUsage(){
       JButton    btnUsage=    new JButton("사용법 보기");

       btnUsage.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent ae){
               try{
                   Runtime rt=    Runtime.getRuntime(); //사용법을 보기위한 버튼을 눌렀을때 발생하며, 로컬의 인터넷익스플로러를 실행시킨다. 문제점은 아래의 경로상에 iexplore가 없다면 익셉션을 일으킨다. ㅡ,.ㅡ;;
                   try{
                       Process    p1=    rt.exec("C:\\Program Files\\Internet Explorer\\IEXPLORE.exe http://dogbull.cafe24.com/count/usage.html");
                   }catch(Exception e){
                       System.out.println("Cannot Load Internet Explorer");
                   }
               }catch(Exception e){}
           }
       });

       this.add(btnUsage);
  }
};

class PanelAbout extends JPanel{
  public PanelAbout(){
       JTextArea    txt=    new JTextArea("", 10, 10);
       txt.append("Cyworld Up Counter.\n\n");
       txt.append("CopyLeft by DogBull(ParkJuHyun)\n\n");
       txt.append("There is a legal responsibility\n");
       txt.append("all to the user, which it\n");
       txt.append("happens as use this program.\n");

       txt.setEditable(false);

       this.add(txt);
  }
};

//주로 에러를 출력하기 위한 팝업 다이얼로그 창이다.
class childWindow extends JDialog implements ActionListener{
  JLabel    msg=        new JLabel("", JLabel.CENTER);
  JButton btnConfirm=    new JButton("Confirm");

  public childWindow(JFrame f){
       super(f, "Error", true);
      
       btnConfirm.addActionListener(this);
       this.add("North", msg);
       this.add("South", btnConfirm);
  }

  public void show(String str){
       this.setResizable(false);

       msg.setText(str);
       this.setSize(150, 80);
       super.show();
       this.pack();
  }

  public void actionPerformed(ActionEvent ae){
       dispose();
  }
};

첨부된 파일은 컴파일 및 실행파일까지 제작 완료된 것이다.

시작은 미미하나, 디버깅은 창대하다.