给命令行做一个GUI,JAVA版

来源:互联网 发布:stc15w404as数据手册 编辑:程序博客网 时间:2024/06/10 06:04

在CSDN论坛主页上看到,C#区有大牛给DOS的CMD做了个GUI,挺好玩的,我也动手做一个

 

程序根本没优化...(其实..连流释放都没有做...太懒了...)

有兴趣的可以再改改,再优化优化~~

 

CHANGELOG:

2012-07-05:增加了TAB补全的功能


效果图:

 

源代码:
ConsoleGUI.java:

package consoleGUI;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.io.PrintWriter;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.UIManager;import javax.swing.border.TitledBorder;import javax.swing.text.DefaultCaret;public class ConsoleGUI extends JFrame {private static final long serialVersionUID = 1L;private JTextField tf_cmd;private JButton btn_run;private JTextArea ta_result;private Process process;private PrintWriter out;public ConsoleGUI() {// 窗体大小this.setPreferredSize(new Dimension(500,500));this.setTitle("命令行GUI");// 命令框及按钮TitledBorder titledBorder = new TitledBorder("Command input");JPanel topPanel = new JPanel(new BorderLayout());topPanel.setBorder(titledBorder);topPanel.add(tf_cmd = new JTextField(),BorderLayout.CENTER);topPanel.add(btn_run = new JButton("执行"),BorderLayout.EAST);tf_cmd.setFocusTraversalKeysEnabled(false);this.getContentPane().add(topPanel,BorderLayout.NORTH);// 显示结果JScrollPane resultPanel = new JScrollPane(ta_result = new JTextArea(10,10));this.getContentPane().add(resultPanel);((DefaultCaret)ta_result.getCaret()).setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 启动一个CMDtry {this.process = Runtime.getRuntime().exec("cmd");// 获取CMD的输出流this.out = new PrintWriter(process.getOutputStream());// 将CMD的输入流绑定到显示框中new ConsoleIntercepter(ta_result, process.getInputStream()).start();new ConsoleIntercepter(ta_result, process.getErrorStream()).start();} catch (IOException e) {e.printStackTrace();}// 执行按钮 将命令发送给CMDthis.btn_run.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if(tf_cmd.getText().equals(""))return;ta_result.setText("");out.println(tf_cmd.getText());out.flush();}});this.tf_cmd.addKeyListener(new KeyAdapter() {@Overridepublic void keyReleased(KeyEvent e) {// 命令框中按下回车键的事件if(e.getKeyCode() == KeyEvent.VK_ENTER) {btn_run.doClick();tf_cmd.setText("");}// 命令框中按下TAB键的事件if(e.getKeyCode() == KeyEvent.VK_TAB) {if(!tf_cmd.getText().equals("")) {TabResult result = pressTab(tf_cmd.getText());if(result != null) {if(result.multi) {StringBuilder sb = new StringBuilder();for(int i = 0; i < result.filenames.length; ++i)sb.append(result.filenames[i]).append('\t').append((i+1) % 5 == 0 ? "\n" : "");ta_result.setText(sb.toString());} elsetf_cmd.setText(result.result + " ");} elseToolkit.getDefaultToolkit().beep();}}}});}// TAB 查找命令的结果private class TabResult {boolean multi;String result;String[] filenames;public TabResult(String result) {this.multi = false;this.result = result;}public TabResult(File[] files) {this.multi = true;String[] filenames = new String[files.length];for(int i = 0; i < filenames.length; ++ i)filenames[i] = files[i].getName();this.filenames = filenames;}}// 按下TAB时的动作private TabResult pressTab(String startwith) {FilenameFilter fileFilter = new CmdFileFilter(startwith);// 首先查找执行路径File currentDir = new File("./");File file[] = currentDir.listFiles(fileFilter);if(file.length > 0)return file.length > 1 ? new TabResult(file) : new TabResult(file[0].getName());// 搜索系统PATH路径String[] systemEnvPath =  System.getenv().get("Path").split(";");return checkSystemEnvPath(fileFilter,systemEnvPath,0);}// 遍历系统路径private TabResult checkSystemEnvPath(FilenameFilter fileFilter,String[] systemEnvPath,int index) {if(index >= systemEnvPath.length)return null;File file[] = new File(systemEnvPath[index]).listFiles(fileFilter);if(file.length > 0)return file.length > 1 ? new TabResult(file) : new TabResult(file[0].getName());elsereturn checkSystemEnvPath(fileFilter, systemEnvPath, ++index);}// TAB查找时用来过滤文件名private class CmdFileFilter implements FilenameFilter {private String startwith;public CmdFileFilter(String startwith) {this.startwith = startwith;}@Overridepublic boolean accept(File dir, String name) {// TODO 谁知道怎么匹配系统内部命令 比如DIR这种?return name.startsWith(startwith) && (name.endsWith(".exe") || name.endsWith(".com") ||name.endsWith(".bat"));}}// 显示窗体public void showFrame() {this.pack();this.setVisible(true);}public static void main(String[] args) {// JDK 6U10以上版本,采用Nimbus显示风格try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");} catch (Exception e) {System.out.println("没有安装jre6u10,尝试当前系统的风格");try {UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());} catch (Exception e1) {e1.printStackTrace();}}// 启动程序ConsoleGUI gui = new ConsoleGUI();gui.showFrame();}}



ConsoleIntercepter.java:

package consoleGUI;import java.io.IOException;import java.io.InputStream;import javax.swing.JTextArea;public class ConsoleIntercepter extends Thread{private JTextArea text;private InputStream is;public ConsoleIntercepter(JTextArea text,InputStream is) {this.text = text;this.is = is;}@Overridepublic void run() {byte[] buf = new byte[1024];int size;while(true) {try {while((size = is.read(buf)) != -1) {text.append(new String(buf,0,size,"gbk"));}} catch (IOException e) {e.printStackTrace();break;}}}}



你问这个蛋疼的东西有什么用?
引用C#作者的话:
[你可以给命令行下的「DOS」程序,穿上一层WinForm的外衣,给原来只有命令行的程序制作一个精美的GUI。。]

原创粉丝点击