#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;
}
}
}