本人初学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.希望大家都给我一些改进意见,多见到一些解决问题的方法。
程序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、事件监听改为 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、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()截获键盘输入吗(不知道对不对)?截获之后,如果是非法字符,该怎样处理,才能不让他显示在文本框里呢?
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);
}
});
}
}
先说表层的,
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);
}
});
}}
改的很帅! bug没了,还把我没想到的bug也改掉了,呵呵,原来没想到限制只在一个文本框内输入。
我尝试将public void keyPressed(KeyEvent e)的语句删掉,效果似乎更有趣,呵呵,竟然做到其他文本框无法输入,这可是我一直追求的呢!
但是改过的程序还是没有实现这个——非法字符无法输入,呵呵,不过已经很棒了! 学到了一些规范,谢了!
那个,,Java doc的安装似乎很繁琐,没用过,请问Java doc与JavaAPI文档有什么区别么?
@Override
public void insertString(int offset, String input, AttributeSet attributeset) throws BadLocationException { if (input.matches("[^\\d\\.]+")) return; //输入非数字和小数点。则忽略
super.insertString(offset, input, attributeset);
}
java doc,由java注释生成的文档。javaAPI文档,jdk的doc看API意思似乎keyPressed是键按下去,keyReleased是键放开。
我改的时候参照3楼的意见找的KeyListener。以前看过文档,没写过,看你的程序可以跑,就拿来试了下。你说的非法字符的问题,似乎用正则表达式可以限制住。我的本意也是看看swing程序是什么样子的,没大看你的需求。
很惊叹啊!首先,实现了我想要的功能。 其次对我程序错误的指出。
真的实现了非法字符无法输入! 关于程序中的错误:首先那个循环中数组的下标,果然都不见了。。我也很纳闷的。。 我就是复制粘贴的啊,怎么会没了。。 关于那个DocumentListener,这个是本人比较懒没有删掉的。。因为以前是想实现非法字符无法输入,然后想到了这个监听器,事实上正如你所说是错误的,用这个监听,从原理上就不对。 关于您的强烈建议,呵呵,恩,我的程序很不规范,因为第一次接触这么多的概念,而且,做这个程序,我们又看教程的,而是看同学的一个相关的程序,看懂之后就写自己的了,至于规范什么的,就了解的很少了。 最后关于逻辑问题,恩,你说的都对,是最后一个文本框接收的算数,开始我没有想过同时输入的问题,但现在五楼大哥为我解决了,呵呵,清空了。想跟你联系一下,因为实现非法字符无法输入的那段关键代码,我有点看不懂,还有一些语法问题。
谢谢你的帮助拉!
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);
}
}