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

#JAVA窗口工具类拆分说明

直接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;
		}
	}
}

完整源码

package linWanCheng.WinUtils;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;

/**
 * 直接新建本类即可自动创建GUI窗口,<br>
 * 用于替代控制台、实现字符游戏无缝输出<br><br>
 * 使用input()获取输入框文本<br>
 * 使用print()/println()把文本打印到输出框<br>
 * 使用clear()清空输出框<br>
 * 使用printNew()清空内容并输出<br>
 * 使用getKey()获取输入按键码与KeyEvent类的常量比较<br>
 * @author linWanCheng
 * @version 2.0 添加设置系统输出输入流为本窗口功能
 */

public class Win {

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

	// ******输出******

	/**
	 * 输出不换行
	 * @param str
	 */
	public <T> void print(T str) {
		out.append(String.valueOf(str));
		out.setCaretPosition(out.getText().length());
	}

	/**
	 * 输出并换行
	 * @param str
	 */
	public <T> void println(T str) {
		out.append(String.valueOf(str));
		out.append("\n");
		out.setCaretPosition(out.getText().length());
	}

	/**
	 * 清空原有内容输出
	 * @param str
	 */
	public <T> void printNew(T str) {
		out.setText(String.valueOf(str));
		out.setCaretPosition(out.getText().length());
	}

	/**
	 * 清空输出框
	 */
	public void clear() {
		out.setText("");
	}

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

	/**
	 * 当输入框按下回车且内容不为空时返回内容
	 * @return 返回输入框的内容
	 */
	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;
	}

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

	/**
	 * 返回输入框按下的按键名文本,并清空输入框
	 * @return 按键名文本
	 */
	public String getKeyName() {
		return KeyEvent.getKeyText(getKey());
	}

	// ******构造与初始化******

	public Win() {
		init();
	}

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

	private void init() {
		setSize(400, 300);

		// 先添加输入文本框到窗体以便自动获得光标
		f.add(in, BorderLayout.SOUTH);

		// 添加输出文本域到窗体
		f.add(out);

		// 设置窗体关闭
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		// 文本框按键释放时把按键记录到key
		in.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {
				// 内部类可以:读取finally局部变量,读写类变量
				key = e.getKeyCode();
			}
		});
		
		// 设置窗体可见
		f.setVisible(true);
	}

	/**
	 * 设置大小并居中窗口(用Screen在API文档搜索知道这个类)<br>
	 * 默认(400, 300)
	 * @param width
	 * @param hight
	 */
	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);
	}
	
	// ******设置为默认输入输出流******
	
	PrintStream printStream = new PrintStream(new WinOutputStream());
	
	/**
	 * 设置System.out为Win的输出文本域
	 */
	public void setOut() {
	    System.setOut(printStream);
	}
	
	/**
	 * 设置System.out为Win的输出文本域
	 */
	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());
		}
	}
	
	/**
	 * 设置System.in为Win的输入文本框
	 */
	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;
		}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值