在主页上看到,C#区有大牛给DOS的CMD做了个GUI,挺好玩的,我也动手做一个
C#贴:http://topic.csdn.net/u/20120630/19/C3D46E45-72AB-4278-9C87-EB6B88038B95.html程序相对来说很简单,(连释放都没有管,直接exit了,太偷懒了...)效果图:
源代码:
ConsoleGUI.java:package consoleGUI;import java.awt.BorderLayout;
import java.awt.Dimension;
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.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);

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());
// 将CMD的输入流绑定到显示框中
new ConsoleIntercepter(ta_result, process.getInputStream()).start();
new ConsoleIntercepter(ta_result, process.getErrorStream()).start();
} catch (IOException e) {
e.printStackTrace();
}

// 执行按钮 将命令发送给CMD
this.btn_run.addActionListener(new ActionListener() {
@Override
public 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() {
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
btn_run.doClick();
tf_cmd.setText("");
}
}
});
}

// 显示窗体
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;
}

@Override
public 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。。]

解决方案 »

  1.   

    呵呵 一直想学GUI 
      

  2.   

    我觉得做成网络版的就编程winshell了
      

  3.   

    <??>读取进程的输出流输入流和错误流并放到一个JTextrea 
    runtime.exec("cmd")
      

  4.   

    这个主意不错
    用socket作为流通道 就可以做远程调用了
    简易SSH?
      

  5.   

    lz的UI皮肤包是否可以可以共享一下。上传一下,给个资源连接吧。
      

  6.   

    不需要哦
    JDK6 U10以上版本自带的Nimbus风格
      

  7.   

    没有命令行那酷酷的感觉没有tab 命令补全功能
      

  8.   

    我感觉还是把 GUI 的做到控制台中,也就是使用 ASCII 字符来呈现 GUI 看上去有意思,呵呵,像这种:
      

  9.   

    这个...咱还木有那个水平...笑...AND:加了TAB补全的功能,新帖地址:
    http://topic.csdn.net/u/20120705/11/72e36e68-77c9-4f4c-827c-c7b85100045a.html
      

  10.   

    CSDN相册么...你知道的...每个月总有那么几天...
      

  11.   

    呵呵,那玩意早就有了,我在国外看到最初的版本是vc6,是在06年的时候,然后一哥们儿给翻译成bc6可,然后还在杂志上发表了,后来我稀里糊涂的改成了vb6的,(当然在这里有很多高手也改成很多其他的语言,应该也是有的),但多年之后又成了新鲜东西了,哈哈,很有趣啊,写这些只是感觉CSDN越来越水了,这么老的东西,都成了精品啊,CSDN啊 ):
      

  12.   

    似乎没有什么用。与cygwin的那个terminal没法比。
      

  13.   

    高人...如果2个类就能做到比终端还好,那cygwin就该下岗了主要是swing部分的代码多,核心代码其实没几行
    话说,这样只需要java核心jdk就行了,qt首先不说没有完善的java版本,而且不是还要加载整个qt库吗?这个库难道不需要代码写的吗? 那如果我把文件整成jar,然后用一句话调用一下,可不可以说我的代码只有一行那?
      

  14.   

    是一个简单的练习的东西吧,算不上所谓...大牛...很多东西没考虑在里面执行  ping 192.168.1.1 -l 2000 -t则如何结束?在cmd下可以 ctrl+c 
      

  15.   

    问个问题 为什么在原有cmd里ping 127.0.0.1有显示,在这个做了GUI的cmd里输入ping 127.0.0.1会显示“ping 不是内部命令。”呢???
      

  16.   


    你好,请问一下你的程序是怎么打开盘符的?我自己写的怎么打不开盘符,只能打开诸如“ipconfig”这样的
      

  17.   

    看文章的都是些什么级别的人啊?就这么一个烂东西,还到处都是夸赞之词,有处理ctrl+c吗?如果输入了ping 127.0.0.1 -t请问如何退出?