JAVA版给DOS做个外衣(GUI)

最近看到一个网友编写一个很有意思的事, 通常我可以在电脑的开始菜单那里 运行, 输入CMD即可启动DOS,然后在DOS下输入各种命令进行操作, 所有结果都在这个DOS窗口显示;

有意思的是这网友把这个变成了有界面的的情况,在输入框里输入各种DOS命令,运行,命令执行结果显示在下面的输入框中, 命令和结果都一样,就是换了一个界面而已, 很有意思, 我照着做修改了一点点, 其中也学到一点东西;


先讲解一下例子: 思路就是利用Java调用DOS命令,然后从界面上获取各种命令,传到DOS下执行,然后把执行的结果取回显示到文本框中, 一个主类,一个辅助类,下面是代码:


主类: ConsoleCMDGUI.java

package com;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UIDefaults;
import javax.swing.border.TitledBorder;
import javax.swing.text.Caret;
import javax.swing.text.DefaultCaret;

import com.ConsoleIntercepter;  //自定义类

/**
 * @author: ? 
 * http://topic.csdn.net/u/20120704/13/0AD22896-145D-4A96-A2AC-2FDEF5AE1729.html
 *
 */
public class ConsoleCMDGUI extends JFrame {

	/**
	 * @param args
	 */
	private static final long serialVersionUID = 10000L;

    private JTextField tf_cmd;
    private JButton btn_run;
    private JTextArea ta_result;
    
    private Process process;
    private PrintWriter out;
	    
    
	//------------start: constructor method------------
	public ConsoleCMDGUI() {
		//super();
		
		//窗体大小标题
		this.setTitle("命令行 GUI");
		//this.setSize(new Dimension(500,500));
		this.setSize(500, 500);
		
		//命令框及按钮
		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);
		
		this.getContentPane().add(topPanel,BorderLayout.NORTH);
		
		//显示结果
		JScrollPane resultPanel=new JScrollPane(ta_result=new JTextArea());
		this.getContentPane().add(resultPanel);
		((DefaultCaret)ta_result.getCaret()).setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//启动一个CMD
		try{
			this.process=Runtime.getRuntime().exec("cmd");
			
			
			//获取CMD的输出流
			this.out=new PrintWriter(process.getOutputStream());
			//TN1(原理):通过out和process连接,然后通过out把各种DOS命令输出到process对象,
			//在process中执行对应的DOS命令,然后把输出的结果或错误,
			//通过两个线程连接读出并显示到输出框中
			
			//TN2:Java是如果调用DOS命令的,通过Runtime运行时来调用,同时还可类似方法调用其它程序
			
			
			//将CMD的输入流绑定到显示框中
			new ConsoleIntercepter(ta_result, process.getInputStream()).start();
            new ConsoleIntercepter(ta_result, process.getErrorStream()).start();			
		}catch(IOException e){
			//System.out.println(e.toString());
			e.printStackTrace();
		}
		
		//执行按钮 将命令发送给CMD
		this.btn_run.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(tf_cmd.getText().trim().equals("")) return;				
				//ta_result.setText("");  //clear result textarea
				out.println(tf_cmd.getText());
				out.flush(); 				
			}			
		});
		
		//命令框中按下回车键的事件
		this.tf_cmd.addKeyListener(new KeyAdapter(){
			public void keyReleased(KeyEvent e){
				if(e.getKeyCode() == KeyEvent.VK_ENTER){
				btn_run.doClick();
				tf_cmd.setText("");
				}				
			}
		});		
	}
	//-------------end: constructor method-------------
	
	
	//显示窗体
	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();
            }
        }
        
        // 启动程序
        ConsoleCMDGUI gui = new ConsoleCMDGUI();
        gui.showFrame();
	}
}


辅助类: ConsoleIntercepter.java , 功能是建立一个线程类,完成把DOS命令执行结果放到文本框中

package com;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JTextArea;

public class ConsoleIntercepter extends Thread { 
	//通过继承实现多线程, 也可以实现 Runnable 接口来实现多线程
    private JTextArea text;
    private InputStream is;
    
    public ConsoleIntercepter(JTextArea text,InputStream is) {
        this.text = text;
        this.is = is;
    }
    
    public void run() {//重写run方法
        byte[] buf = new byte[1024];
        int size;
        while(true) {
            try {
                while((size = is.read(buf)) != -1) {
                    text.append(new String(buf,0,size,"GB2312"));//gbk ok too
                    //从数组buf的0下标开始取size个元素,
                    //用指定的编码建立字符串然后追加到文本框之后
                }
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
    }
}

例子中关键的地方有:

1,通过out和process连接,然后通过out把界面上各种输入的DOS命令输出到process对象, 在process中执行对应的DOS命令, 然后把输出的结果或错误, 通过两个线程连接读出并显示到输出框中,这里是本利的核心思路;


2,本利展示了Java是如果调用DOS命令的,通过Runtime运行时来调用,并执行之,同时如果获取和处理执行的结果; 类似的,该方法也可调用其它的应用程序,并接管调用的结果;


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微型16/32位嵌入式GUI,自主开发,历时四年左右,拥有全部权. http://www.ecgui.com 体积小巧 大小在 100KB~180KB! 特性: 多窗口支持| 完全中文输入/显示| 多数常用GUI控件| 99.9% ANSI C 编写| 已成功移植 DOS,Linux,uc/OS-II| 组件式 API(易用,高效) GUI SDK-Green for DOS Beta 开发包下载 305 KB 火热下载中 http://ecurb2006.googlepages.com/sdk-green-4dos.zip 演示程序下载 264 KB http://ecurb2006.googlepages.com/demo.zip 微型嵌入式GUI编程指南 PDF 下载 349 KB http://ecurb2006.googlepages.com/embeddedguiprogrammingguide.pdf GUI SDK For Windows Beta 开发包下载 583 KB http://ecurb2006.googlepages.com/sdk4win.zip 包含详细使用说明 部分应用程序 截图 记事本 http://ecurb2006.googlepages.com/edit.jpg 计算器 http://ecurb2006.googlepages.com/calc.jpg 画笔 http://ecurb2006.googlepages.com/painter.zip 支持控件 MAINWINDOW 主窗口 DLGWINDOW 对话框窗口,从属于主窗 BUTTON 按钮 MAINMENU 下拉式菜单 POPMENU 弹出式菜单 HSCROLLBAR 横向滚动条 VSCROLLBAR 竖向滚动条 TEXTBOX 单行文本编辑框 EDITBOX 多行文本编辑框 COMBOBOX 组合框 LISTBOX 列表框 CHECKBOX 多项选择框 CHOICEBOX 单项选择框 LABEL 文字标签 PAGEVIEW 标签页 SPEEDBAR 进度条 商业使用,将提供 GUI 全部源代码,低价授权策略,并提供 GUI 移植技术支持! 请联系 sales@ecurb2006.com 更多信息请访问 http://www.ecurb2006.com 针对 不少网友开发免费 DOS 软件的想法,现在提供 DOS 下的开发库,个人或者组织可以开发公共使用的免费软件,借这个机会,也希望能更好的推广这个 GUI.会在程序显示区域头部显示 GUI 的介绍性信息(无其他无关信息)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值