当前位置 : 主页 > 编程语言 > c++ >

【Java窗口工具类】创建本类即可创建窗口 可设置系统输入输出为本窗口 捕捉按

来源:互联网 收集:自由互联 发布时间:2021-07-03
Win.java 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 ja
Win.java
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窗口,
* 用于替代控制台、实现字符游戏无缝输出

* 使用input()获取输入框文本
* 使用print()/println()把文本打印到输出框
* 使用clear()清空输出框
* 使用printNew()清空内容并输出
* 使用getKey()获取输入按键码与KeyEvent类的常量比较
* @author linWanCheng * @version 2.0 添加设置系统输出输入流为本窗口功能 */ public class Win { // 这里的变量不私有是为了方便拓展使用 /** 窗口 */ Frame f = new Frame(); /** 输出文本域 */ TextArea out = new TextArea(); /** 输入文本框 */ TextField in = new TextField(); // ******输出****** /** * 输出不换行 * @param str */ public void print(T str) { out.append(String.valueOf(str)); out.setCaretPosition(out.getText().length()); } /** * 输出并换行 * @param str */ public void println(T str) { out.append(String.valueOf(str)); out.append("\n"); out.setCaretPosition(out.getText().length()); } /** * 清空原有内容输出 * @param str */ public 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文档搜索知道这个类) * 默认(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)
网友评论