本人初学Java两个月,第一次自己出窗口。 现将源码奉上,同时提出几个我还无法解决的问题,还有部分bug,希望大家共同探讨 
程序100行,可运行,进制转换器。  
程序其实很简单!  主要思路是:1.文本框接收输入的内容 2.监听到得文本框将字符转化成十进制,赋给一个中间变量
3.再由这个中间变量转化为不同的值,分别在相应的文本框中显示出来。
就这三步,大家不要被程序的长度误导,失去阅读的兴趣,注释详细,结构鲜明,读起来应该不太费劲儿。。//引包
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.lang.NumberFormatException;//程序放在一个文件中,只有一个类
public class test extends JFrame implements DocumentListener,ActionListener //需要用到文本监听器、动作监听器
{
//声明控件与变量
   int zhong; //数值转换的中间变量
   boolean flag=false;//按钮标志位
   JPanel panel; //一个panel容器
   JButton changeButton; //声明转换按钮
   JLabel []title=new JLabel[4];  //label组
   JTextField []value=new JTextField[4]; //文本框组
//构造
public test()  
{
  super("Java程序设计"); //JFrame参数
  Container content=this.getContentPane(); //容器对象声明 
  content.setLayout(null); //布局为空
  panel=new JPanel(null);  //panel定义                                                         
  panel.setBounds(new Rectangle(0,0,300,350));//定义panel显示区域 
  panel.setBorder(BorderFactory.createTitledBorder("进制转换器")); //panel标题
  
  title[0]=new JLabel("二进制");//label
  title[1]=new JLabel("八进制");
  title[2]=new JLabel("十进制");
  title[3]=new JLabel("十六进制");
  for(int i=0;i<title.length;i++)//添加label
   title.setBounds(new Rectangle(10,20+i*60,70,35));
  for(int i=0;i<value.length;i++) //文本框初始化
  {
   value=new JTextField(20);
   value.setBounds(new Rectangle(80,20+i*60,180,25));
   value.getDocument().addDocumentListener(this);//文本框加监听器
  }
  changeButton=new JButton("转换");//转换纽
  changeButton.setBounds(new Rectangle(60,260,210,25));
  changeButton.addActionListener(this);
  for(int i=0;i<title.length;i++)   //向panel添加控件
   panel.add(title);
  for(int i=0;i<value.length;i++)
   panel.add(value);
  panel.add(changeButton);
  content.add(panel);   //向content中添加panel
  setSize(300,350);    //窗口大小
  this.setLocationRelativeTo(null); // 居中
  setResizable(false);//禁止改变窗口大小
  show();  //显示
}
  public void changedUpdate(DocumentEvent e){}   //满足语法要求,接口中抽象函数实现
  public void removeUpdate(DocumentEvent e){}
//监听动作
     public void insertUpdate(DocumentEvent e) //文本框监听后动作实现 
     {
   try{
          if(value[0].getText().length()!=0)  //由于四个文本框监听后动作不同,所以要分别识别出每个文本框的改变
                    zhong=Integer.parseInt(value[0].getText(),2); //二转十函数
      }catch (NumberFormatException ee) 
    {
                   JOptionPane.showMessageDialog(null,"输入数据不合法","信息提示",JOptionPane.PLAIN_MESSAGE);
                   //value[0].setText("");  此处是清空文本框内容,以便重新输入的,但是运行总有错误,找不出原因
                   //zhong=0;
    }
   try {
       if(value[1].getText().length()!=0)
        zhong=Integer.parseInt(value[1].getText(),8);//八转十函数
       }
    catch(NumberFormatException ee)
       {
     JOptionPane.showMessageDialog(null,"输入数据不合法","信息提示",JOptionPane.PLAIN_MESSAGE);
    }
   try
    {
     if(value[2].getText().length()!=0)
            zhong=Integer.parseInt(value[2].getText());//字符串转int函数
    }
    catch (NumberFormatException ee)
    {
     JOptionPane.showMessageDialog(null,"输入数据不合法","信息提示",JOptionPane.PLAIN_MESSAGE);
    }
   try
   {
    if(value[3].getText().length()!=0)
        zhong=Integer.parseInt(value[3].getText(),16);//十六转十函数
   }
   catch (NumberFormatException ee)
   {
    JOptionPane.showMessageDialog(null,"输入数据不合法","信息提示",JOptionPane.PLAIN_MESSAGE);
   }
   
     }
     
  public void actionPerformed(ActionEvent e)//按钮监听动作后实现
     {  
   if(e.getSource()==changeButton)
   {
    if(!flag)
    {
     value[0].setText(Integer.toBinaryString(zhong)); //十转二函数
        value[1].setText(Integer.toOctalString(zhong));//十转八函数
        value[2].setText(Integer.toString(zhong));//int转字符串函数
        value[3].setText(Integer.toHexString(zhong)); //十转十六函数
        flag=true;
     changeButton.setLabel("清空");
    }
    else if(flag)//清空
       {     
        for(int i=0;i<4;i++)
           value.setText("");
        zhong=0;
        flag=false;
     changeButton.setLabel("转换");
       }
   }
   
  }
  
public static void main(String[] args) 
{
  test cr=new test();//构造后,产生窗口
  cr.addWindowListener(new WindowAdapter()//关闭按钮响应
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
    }
}程序中存在的bug:输入非法字符后,文本框无法清空
程序中解决不了的问题:1.对于非法输入的处理,本来是想模仿windows自带的计算器那样:非法字符无法输入。 但是实现起来遇到困难不得不放弃,希望高手们能把我的难题解决。。
2.由于想实现问题1的功能,文本框我也加了监听,其实不必。为了检测哪个文本框接收键盘输入,我用判断其字符串长度是否为空的方式实现,这种方式很不正规,想知道其他方法。。
3.希望大家都给我一些改进意见,多见到一些解决问题的方法。

解决方案 »

  1.   

    首先解决你那两个问题
    1、事件监听改为 KeyListener 监听键盘事件就可以。
       之所以文本框无法清空就是因为这个问题,因为你清空的时候又触发了DocumentListener事件,有死循环的嫌疑,所以报了错
    2、判断事件源有方法的,改为
        if(e.getSource()==value[0]) {}另外说几点要注意的问题:
    1、类名首字母大写(规范)
    2、注释要做关键的,一般人都看得懂的就不用做注释了,必须作注释的有类,自定义方法,自定义变量,
      另外类注释最好这样做:
    /**
     * 功能:进制转换
     * 
     * @author linzhj
     * @date 20091126
     */方法注释:
    /**
     * 功能:
     * 
     * @param 参数说明
     * @return 返回值说明
     * @throws 异常
     */单行注释比较长的最好放在要注释内容的上面,而不是后面3、  for(int i=0;i <4;i++)
              value.setText(""); 
    像这种最好加上大括号,不加看着很不舒服,而且方便以后修改,比如要再添加一条语句的时候4、int zhong;  最好定义成 private int zhong; (体现封装的思想)
       另外这个变量名字应该叫temp(命名规范)5、 show(); 改为 setVisible(true);   因为show()已经过时了
    呵呵,论坛的积分不好赚啊。。
    2个月学的不错了哦~~
      

  2.   

     在规范上,这位大哥可以做我的领路人,呵呵。你说的12345我都记下了 
    其中的2、4、5对我的帮助很大,还有关于清空文本框报错的原因,十分感谢!
    我刚注册不久,论坛的操作不是十分熟悉,不知道这样回复您能不能看到啊。。关于这两个解决方案,我还有地方不明:
    1、判断事件源有方法的,改为 
     if(e.getSource()==value[0]) {}   
    但我查过API文档,DocumentEvent类中好像没有继承java.awt.AWTEvent,所以没有e.getSource()方法。。
    2、事件监听改为 KeyListener 监听键盘事件就可以。
    如果要用KeyListener,也就是说不用DocumentListener,则出现以下问题:
    1.监听键盘,则一有键盘输入,监听对象生成,开始动作。但是我有四个文本框,不同的文本框对应着不同的操作,所以必须判断是那个文本框接收了键盘输入,这个应该怎么做呢?
    2.监听键盘之后,在此函数void keyTyped(KeyEvent e)中进行键盘输入后的判断和操作,这样就需要捕获输入的字符,是用getKeyChar()截获键盘输入吗(不知道对不对)?截获之后,如果是非法字符,该怎样处理,才能不让他显示在文本框里呢?
      

  3.   

    楼主,按照3楼的意见给你改了下,有不对的地方请高手指教。import java.awt.Container;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;//import javax.swing.event.DocumentEvent;//程序放在一个文件中,只有一个类
    public class Computer extends JFrame implements KeyListener, ActionListener // 需要用到文本监听器、动作监听器
    {
    public static final long serialVersionUID = 1L; // 声明控件与变量
    private int temp; // 数值转换的中间变量 private boolean flag = false;// 按钮标志位 private JPanel panel; // 一个panel容器 private JButton changeButton; // 声明转换按钮 private JLabel[] title = new JLabel[4]; // label组 private JTextField[] value = new JTextField[4]; // 文本框组 // 构造 public Computer() {
    super("Java程序设计"); // JFrame参数
    init();
    } private void init() {
    Container content = getContentPane(); // 容器对象声明
    content.setLayout(null); // 布局为空
    panel = new JPanel(null); // panel定义
    panel.setBounds(new Rectangle(0, 0, 300, 350));// 定义panel显示区域
    panel.setBorder(BorderFactory.createTitledBorder("进制转换器")); // panel标题 title[0] = new JLabel("二进制");// label
    title[1] = new JLabel("八进制");
    title[2] = new JLabel("十进制");
    title[3] = new JLabel("十六进制");
    for (int i = 0; i < title.length; i++) {
    title[i].setBounds(new Rectangle(10, 20 + i * 60, 70, 35));
    }
    for (int i = 0; i < value.length; i++) {
    value[i] = new JTextField(20);
    value[i].setBounds(new Rectangle(80, 20 + i * 60, 180, 25));
    value[i].addKeyListener(this);
    }
    changeButton = new JButton("转换");// 转换纽
    changeButton.setBounds(new Rectangle(60, 260, 210, 25));
    changeButton.addActionListener(this);
    for (int i = 0; i < title.length; i++)
    // 向panel添加控件
    panel.add(title[i]);
    for (int i = 0; i < value.length; i++)
    panel.add(value[i]);
    panel.add(changeButton);
    content.add(panel); // 向content中添加panel
    setSize(300, 350); // 窗口大小
    this.setLocationRelativeTo(null); // 居中
    setResizable(false);// 禁止改变窗口大小
    setVisible(true); // 显示
    } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) {
    if (e.getSource() == value[0]) {
    clearOthers(0);
    } else if (e.getSource() == value[1]) {
    clearOthers(1);
    } else if (e.getSource() == value[2]) {
    clearOthers(2);
    } else if (e.getSource() == value[3]) {
    clearOthers(3);
    }
    } public void keyReleased(KeyEvent e) {
    if (value[0].getText().length() != 0) { // 由于四个文本框监听后动作不同,所以要分别识别出每个文本框的改变
    try {
    temp = Integer.parseInt(value[0].getText(), 2); // 二转十函数
    clearOthers(0);
    flag = true;
    } catch (NumberFormatException ee) {
    JOptionPane.showMessageDialog(null, "输入数据不合法", "信息提示",
    JOptionPane.PLAIN_MESSAGE);
    clearAll();
    }
    } else if (value[1].getText().length() != 0) {
    try {
    temp = Integer.parseInt(value[1].getText(), 8);// 八转十函数
    clearOthers(1);
    flag = true;
    } catch (NumberFormatException ee) {
    JOptionPane.showMessageDialog(null, "输入数据不合法", "信息提示",
    JOptionPane.PLAIN_MESSAGE);
    clearAll();
    }
    } else if (value[2].getText().length() != 0) {
    try { temp = Integer.parseInt(value[2].getText());// 字符串转int函数
    clearOthers(2);
    flag = true;
    } catch (NumberFormatException ee) {
    JOptionPane.showMessageDialog(null, "输入数据不合法", "信息提示",
    JOptionPane.PLAIN_MESSAGE);
    clearAll();
    }
    } else if (value[3].getText().length() != 0) {
    try {
    temp = Integer.parseInt(value[3].getText(),16);// 十六转十函数
    clearOthers(3);
    flag = true;
    } catch (NumberFormatException ee) {
    JOptionPane.showMessageDialog(null, "输入数据不合法", "信息提示",
    JOptionPane.PLAIN_MESSAGE);
    clearAll();
    }
    } } private void clearAll() {
    for (int i = 0; i < value.length; i++) {
    value[i].setText("");
    }
    } private void clearOthers(int t) {
    for (int i = 0; i < value.length; i++) {
    if (i != t) {
    value[i].setText("");
    }
    }
    } public void actionPerformed(ActionEvent e)// 按钮监听动作后实现
    {
    if (e.getSource() == changeButton) {
    if (flag) {
    value[0].setText(Integer.toBinaryString(temp)); // 十转二函数
    value[1].setText(Integer.toOctalString(temp));// 十转八函数
    value[2].setText(Integer.toString(temp));// int转字符串函数
    value[3].setText(Integer.toHexString(temp)); // 十转十六函数
    flag = false;
    changeButton.setText("清空");
    } else if (!flag)// 清空
    {
    for (int i = 0; i < 4; i++)
    value[i].setText("");
    temp = 0;
    changeButton.setText("转换");
    }
    } } public static void main(String[] args) {
    Computer cr = new Computer();// 构造后,产生窗口
    cr.addWindowListener(new WindowAdapter()// 关闭按钮响应
    {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    }
      

  4.   

    界面方面的问题看java doc,大多数能解决。
      

  5.   

    LZ代码问题很多 
    先说表层的,
    for (int i = 0; i < title.length; i++)
    // 添加label
    title.setBounds(new Rectangle(10, 20 + i * 60, 70, 35));
    没加下标。编译都无法通过。下面那个循环亦然。几乎所有需要引用数组下标的地方……代码的规范上 你参照上面几位的意见,便可基本达标了。再说说监听~~你要知道,监听器的代码在什么时候被执行。
    例如文本框,你既然要非法字符无法输入,加一个documentListenner当然没有用,因为已经被展示出来,这是jdk已经做过的事情,而只有完成这些动作后才会去调用你加的那些监听。这点很重要。既然你要不显示,那就要先下手。而且,强烈建议,一个函数只做一件事情。你的insertUpdate方法里面做了多少事情?处理了多少个文本?他们的业务比较相似,那么就可以进一步封装了。具体见代码。其次的逻辑问题,按照现在的做法,你是取得最后一次修改的文本框内容去修改~~我不知道这否是你的本意。
    我就按照这个逻辑去修改。而且,还有一个问题必须考虑,因为你是文本框,你可以输入很长的字符串,但是,若代表的数字太大了又该如何?
    import java.awt.Container;
    import java.awt.Rectangle;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;//程序放在一个文件中,只有一个类 
    public class Test extends JFrame implements ActionListener // 需要用到文本监听器、动作监听器
    {
    // 声明控件与变量
    int zhong = 0; // 数值转换的中间变量 boolean flag = false;// 按钮标志位
    JPanel panel; // 一个panel容器
    JButton changeButton; // 声明转换按钮
    JLabel[] title = new JLabel[4]; // label组
    JTextField[] value = new JTextField[4]; // 文本框组 private int[] to_int = new int[] { 2, 8, 10, 16 }; // 构造 public Test() {
    super("Java程序设计"); // JFrame参数
    Container content = this.getContentPane(); // 容器对象声明
    content.setLayout(null); // 布局为空
    panel = new JPanel(null); // panel定义
    panel.setBounds(new Rectangle(0, 0, 300, 350));// 定义panel显示区域
    panel.setBorder(BorderFactory.createTitledBorder("进制转换器")); // panel标题 title[0] = new JLabel("二进制");// label
    title[1] = new JLabel("八进制");
    title[2] = new JLabel("十进制");
    title[3] = new JLabel("十六进制");
    for (int i = 0; i < title.length; i++)
    // 添加label
    title[i].setBounds(new Rectangle(10, 20 + i * 60, 70, 35));
    for (int i = 0; i < value.length; i++) // 文本框初始化
    {
    value[i] = new JTextField(20);
    final JTextField f = value[i];
    f.setBounds(new Rectangle(80, 20 + i * 60, 180, 25));
    final int radix = to_int[i];
    f.setDocument(new PlainDocument() {
    @Override
    public void insertString(int offs, String str, AttributeSet a)
    throws BadLocationException {
    // TODO Auto-generated method stub
    System.out.println(offs);
    System.out.println(str);
    try { Test.this.zhong = Integer.parseInt(valueAfterInsert(f
    .getText(), str, offs), radix);
    super.insertString(offs, str, a);
    } catch (Exception e) {
    Toolkit.getDefaultToolkit().beep();
    return;
    }
    } private String valueAfterInsert(String str, String insertStr,
    int offs) {
    String rs = ""; if (offs == str.length()) {
    rs = str + insertStr;
    } else {
    rs = str.substring(0, offs) + insertStr
    + str.substring(offs + 1);
    } return rs;
    } });
    }
    changeButton = new JButton("转换");// 转换纽
    changeButton.setBounds(new Rectangle(60, 260, 210, 25));
    changeButton.addActionListener(this);
    for (int i = 0; i < title.length; i++)
    // 向panel添加控件
    panel.add(title[i]);
    for (int i = 0; i < value.length; i++)
    panel.add(value[i]);
    panel.add(changeButton);
    content.add(panel); // 向content中添加panel
    setSize(300, 350); // 窗口大小
    this.setLocationRelativeTo(null); // 居中
    setResizable(false);// 禁止改变窗口大小
    setVisible(true); // 显示
    } public void actionPerformed(ActionEvent e)// 按钮监听动作后实现
    {
    if (e.getSource() == changeButton) {
    if (!flag) {
    value[0].setText(Integer.toBinaryString(zhong)); // 十转二函数
    value[1].setText(Integer.toOctalString(zhong));// 十转八函数
    value[2].setText(Integer.toString(zhong));// int转字符串函数
    value[3].setText(Integer.toHexString(zhong)); // 十转十六函数 flag = true;
    changeButton.setText("清空");
    } else if (flag)// 清空
    {
    for (int i = 0; i < 4; i++)
    value[i].setText("");
    zhong = 0;
    flag = false;
    changeButton.setText("转换");
    }
    } } public static void main(String[] args) {
    Test cr = new Test();// 构造后,产生窗口
    cr.addWindowListener(new WindowAdapter()// 关闭按钮响应
    {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }}
      

  6.   

    回复五楼:
    改的很帅! bug没了,还把我没想到的bug也改掉了,呵呵,原来没想到限制只在一个文本框内输入。
    我尝试将public void keyPressed(KeyEvent e)的语句删掉,效果似乎更有趣,呵呵,竟然做到其他文本框无法输入,这可是我一直追求的呢! 
    但是改过的程序还是没有实现这个——非法字符无法输入,呵呵,不过已经很棒了! 学到了一些规范,谢了!
      

  7.   

    回复七楼:
    那个,,Java doc的安装似乎很繁琐,没用过,请问Java doc与JavaAPI文档有什么区别么?
      

  8.   

    使用setEditable(false)禁止编辑。继承PlainDocument:
    @Override
        public void insertString(int offset, String input, AttributeSet attributeset) throws BadLocationException {        if (input.matches("[^\\d\\.]+")) return; //输入非数字和小数点。则忽略
            super.insertString(offset, input, attributeset);
        }
      

  9.   


    java doc,由java注释生成的文档。javaAPI文档,jdk的doc看API意思似乎keyPressed是键按下去,keyReleased是键放开。
    我改的时候参照3楼的意见找的KeyListener。以前看过文档,没写过,看你的程序可以跑,就拿来试了下。你说的非法字符的问题,似乎用正则表达式可以限制住。我的本意也是看看swing程序是什么样子的,没大看你的需求。
      

  10.   

    回复八楼:
    很惊叹啊!首先,实现了我想要的功能。 其次对我程序错误的指出。
    真的实现了非法字符无法输入!  关于程序中的错误:首先那个循环中数组的下标,果然都不见了。。我也很纳闷的。。 我就是复制粘贴的啊,怎么会没了。。  关于那个DocumentListener,这个是本人比较懒没有删掉的。。因为以前是想实现非法字符无法输入,然后想到了这个监听器,事实上正如你所说是错误的,用这个监听,从原理上就不对。 关于您的强烈建议,呵呵,恩,我的程序很不规范,因为第一次接触这么多的概念,而且,做这个程序,我们又看教程的,而是看同学的一个相关的程序,看懂之后就写自己的了,至于规范什么的,就了解的很少了。  最后关于逻辑问题,恩,你说的都对,是最后一个文本框接收的算数,开始我没有想过同时输入的问题,但现在五楼大哥为我解决了,呵呵,清空了。想跟你联系一下,因为实现非法字符无法输入的那段关键代码,我有点看不懂,还有一些语法问题。
    谢谢你的帮助拉!
      

  11.   

    如果只是整数值。import java.awt.event.*;import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;import net.java.dev.designgridlayout.DesignGridLayout; // 一个布局管理器public class NumberConverter extends JFrame{
        private static final long serialVersionUID = 1111111111111L;    public NumberConverter() {
            super("Number Converter");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setContentPane(this.initContentPane());
            this.pack();
        }    private JPanel initContentPane() {
            JPanel panel = new JPanel();
            final JTextField inputField = new JTextField(new DecimalDocument(),"Input a decimal number",25);
            final JTextField binaryField = new JTextField(25);
            final JTextField octalField = new JTextField(25);
            final JTextField hexadecimalField = new JTextField(25);
            final JButton convertButton = new JButton("转换");
            final JButton clearButton = new JButton("清空");        binaryField.setEditable(false);
            octalField.setEditable(false);
            hexadecimalField.setEditable(false);        convertButton.setEnabled(false);
            convertButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(final ActionEvent e) {
                    int value = Integer.parseInt(inputField.getText());
                    binaryField.setText(Integer.toBinaryString(value));
                    octalField.setText(Integer.toOctalString(value));
                    hexadecimalField.setText(Integer.toHexString(value));
                }
            });        clearButton.setEnabled(false);
            clearButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(final ActionEvent arg0) {
                    inputField.setText("");
                    binaryField.setText("");
                    octalField.setText("");
                    hexadecimalField.setText("");
                }
            });
            inputField.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void removeUpdate(final DocumentEvent e) {
                    this.setButtonState(e);
                }
                @Override
                public void insertUpdate(final DocumentEvent e) {
                    this.setButtonState(e);
                }
                @Override
                public void changedUpdate(final DocumentEvent e) {
                    this.setButtonState(e);
                }
                private void setButtonState(final DocumentEvent e) {
                    boolean enable = e.getDocument().getLength() != 0;
                    convertButton.setEnabled(enable);
                    clearButton.setEnabled(enable);
                }
            });
            // 以下布局
            DesignGridLayout layout = new DesignGridLayout(panel);
            layout.row().grid(new JLabel("十进制")).add(inputField);
            layout.row().center().add(convertButton).add(clearButton);
            layout.row().grid(new JLabel("二进制")).add(binaryField);
            layout.row().grid(new JLabel("八进制")).add(octalField);
            layout.row().grid(new JLabel("十六进制")).add(hexadecimalField);
            return panel;
        }    public static void main(final String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new NumberConverter();
                    frame.setVisible(true);
                }
            });
        }
    }class DecimalDocument extends PlainDocument {    private static final long serialVersionUID = 1L;    @Override
        public void insertString(final int offset, final String input, final AttributeSet a) throws BadLocationException {
            try {
                int value = Integer.parseInt(input);
            }catch(NumberFormatException e){
                return;
            }
            super.insertString(offset, input, a);
        }
    }