JAVA窗口工具类代码拆解说明

来源:互联网 发布:淘宝网上图片无法显示 编辑:程序博客网 时间:2024/06/05 14:58

JAVA窗口工具类拆分说明

完整源码:https://git.oschina.net/linwancheng/codes/4vze2kc8t3hnyr6a10jfx92

直接Win win = new Win()即可创建窗口,也可以new Win(窗口标题)
使用win.setSize(长,宽)可以设置窗口大小并让窗口重新回到屏幕中心。

使用win.setOut()可以让类似System.out.println()等方法都输出到本窗口,
同理win.setIn()可以设置输入。

直接调用win.println()等方法可以直接输入输出,甚至可以捕捉按键,
win.printNew()方法可以清空输出框并输出,可以让一些字符游戏变得更为真实。

窗体变量

    // 这里的变量不私有是为了方便拓展使用    /** 窗口 */    Frame f = new Frame();    /** 输出文本域 */    TextArea out = new TextArea();    /** 输入文本框 */    TextField in = new TextField();

初始化方法init()

        //设置大小并居中窗口        setSize(400, 300);

简单布局

        // 先添加输入文本框到窗体以便自动获得光标        f.add(in, BorderLayout.SOUTH);        // 添加输出文本域到窗体        f.add(out);        //设置窗体可见        f.setVisible(true);

设置窗体关闭

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

监听按键

        in.addKeyListener(new KeyAdapter() {            public void keyReleased(KeyEvent e) {                // 内部类可以:读取finally局部变量,读写类变量                key = e.getKeyCode();            }        });

*设置大小并居中窗口()

    //(用Screen在API文档搜索知道这个类)    public void setSize(int width, int hight) {    GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();    Point centerPoint = g.getCenterPoint();    f.setBounds(centerPoint.x - width / 2, centerPoint.y - hight / 2,width, hight);    }

构造方法

    public Win() {        init();    }    /**     * 创建并显示带标题的窗口     * @param title      */    public Win(String title) {        f.setTitle(title);        init();    }

输出方法out

输出不换行

    public <T> void print(T str) {        out.append(String.valueOf(str));        out.setCaretPosition(out.getText().length());    }

输出并换行

    public <T> void println(T str) {        out.append(String.valueOf(str));        out.append("\n");        out.setCaretPosition(out.getText().length());    }

清空原有内容输出

    public <T> void printNew(T str) {        out.setText(String.valueOf(str));        out.setCaretPosition(out.getText().length());    }

清空输出框

    public void clear() {        out.setText("");    }

输入方法in

    /** 输入框上最后释放按键的按键码 */    int key;

返回输入内容

    public String input() {        key = -1;        // 阻塞直到监听到按下回车        while (true) {            // 监听进程会修改key值,所以这里需要同步            synchronized (this) {                if (key == KeyEvent.VK_ENTER &&                    !in.getText().trim().equals("")) {                    break;                }            }        }        String rt = in.getText();        in.setText("");        return rt;    }

返回按键

    public int getKey() {        key = -1;        // 阻塞直到监听到按下按键        while (true) {            // 监听进程会修改key值,所以这里需要同步            synchronized (this) {                if (key != -1) {                    break;                }            }        }        in.setText("\n");//如果直接用空白的话不能清空(康鸽帮忙解决)        return key;    }
    //返回输入框按下的按键名文本,并清空输入框    public String getKeyName() {        return KeyEvent.getKeyText(getKey());    }

设为默认IO

    //创建自定义输出流    PrintStream printStream = new PrintStream(new WinOutputStream());

设置输出为本窗口

    public void setOut() {        System.setOut(printStream);    }

设置异常提示为本窗口

    public void setErr() {        System.setErr(printStream);    }

自定义输出流

    class WinOutputStream extends OutputStream {        public void write(int arg0) throws IOException {        }        public void write(byte data[], int off, int len) throws IOException {            out.append(new String(data, off, len));            out.setCaretPosition(out.getText().length());        }    }

设置输入为本窗口

    public void setIn() {        InputStream inputStream = new WinInputStream();        System.setIn(inputStream);    }

自定义输入流

    class WinInputStream extends InputStream {        public int read() throws IOException {            return 0;        }        public int read(byte b[], int off, int len) throws IOException {            byte[] bs = (input()+"\n").getBytes();            for (int i = 0; i < len; i++) {                if ((i+off)<bs.length) {                    b[i] = bs[i+off];                }else {                    return bs.length;                }            }            return len;        }    }}