前期条码比对的改进版,运用List组件获得比对后的数据方法

etr_bruce 2017-06-29 10:21:48
请帮忙思考如下程序中如何将List组件获得的数据导出到文本文档里。


/*条码比对程序*/
import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import javax.swing.*;

import java.util.*;

public class SnTest3 extends JFrame{

private JPanel jp=new JPanel(); //创建JPanel对象(中间容器)

private JLabel[] jlArray={new JLabel("产 品 条 码"),new JLabel("保修卡条码"),new JLabel("外 箱 条 码")};
JLabel jlSum=new JLabel(); //创建显示扫描后数据总笔数的标签
private JTextField jtextSN1=new JTextField(); //创建产品条码文本框
private JTextField jtextSN2=new JTextField(); //创建保修卡条码文本框
private JTextField jtextSN3=new JTextField(); //创建外箱条码文本框
private List info=new List(20); //创建List组件

//构造方法
public SnTest3(){
jp.setLayout(null); //设置中间容器的Layout为空
jlArray[0].setBounds(30, 20, 80, 26); //设置标签位置
jp.add(jlArray[0]); //添加标签到中间容器里
jlArray[1].setBounds(30, 60, 80, 26);
jp.add(jlArray[1]);
jlArray[2].setBounds(30, 100, 80, 26);
jp.add(jlArray[2]);


jtextSN1.setBounds(100,20,180,26);
//jtextSN1.setText("219801A0E0173000016");
jp.add(jtextSN1);
jtextSN2.setBounds(100,60,180,26);
jp.add(jtextSN2);
jtextSN3.setBounds(100,100,180,26);
jp.add(jtextSN3);
info.setBounds(100, 140, 180, 320);
jp.add(info);
jlSum.setBounds(100,465,180, 26);
jp.add(jlSum);

//注册事件监听者
jtextSN1.addActionListener(new Listener());
jtextSN2.addActionListener(new Listener());
jtextSN3.addActionListener(new Listener());




this.add(jp); //将中间容器添加到顶层窗体中
this.setTitle("条码比对程序"); //设置顶层窗体标题
this.setResizable(false); //设置顶层窗体最大化不可见
this.setBounds(500, 100, 320, 520); //设置顶层窗体位置和大小
this.setVisible(true); //设置顶层窗体显示可见
}

public class Listener implements ActionListener{ //定义监听者类,并实现接口中的方法

public void actionPerformed(ActionEvent e){ //实现actionPerformed()方法处理事件
String s1="",s2="",s3="";
if(info.getItemCount()>99){
JOptionPane.showMessageDialog(null, "对不起,已超过100行!");
jtextSN1.setText("");
jtextSN2.setText("");
jtextSN3.setText("");
return;
}
s1=jtextSN1.getText();
s2=jtextSN2.getText();
s3=jtextSN3.getText();
int line=info.getItemCount();
//条码输入光标移位,条码比对**
if(s1.equals("")){ //判断光标是否定位在待输入的空白文本框内
jtextSN1.requestFocus();
}else if(s2.equals("")){
jtextSN2.requestFocus();
}else if(s3.equals("")){
jtextSN3.requestFocus();
}else if(s1.equals(s2)&&s2.equals(s3)){ //判断扫入的条码是否一致
//将文本框中内容转换为大写
String sn=s3.toUpperCase();

for(int i=0;i<info.getItemCount();i++){ //判断已录入过的条码是否与正在比对的条码重复
if(info.getItem(i).equals(sn)){ //如果重复,弹出警告对话框,且跳出循环
JOptionPane.showMessageDialog(null, "录入条码重复!","警告",JOptionPane.WARNING_MESSAGE);
jtextSN1.setText("");
jtextSN2.setText("");
jtextSN3.setText("");
jtextSN1.requestFocus();
return; //跳出循环
}
}

info.add(sn); //如果不重复,则将比对后的条码录入List
jlSum.setText("共扫入"+(line+1)+"行");
jtextSN3.setText("");
jtextSN2.setText("");
jtextSN1.setText("");
jtextSN1.requestFocus();
}else{
JOptionPane.showMessageDialog(null, "条码比对错误!","错误",JOptionPane.WARNING_MESSAGE);
jtextSN1.setText("");
jtextSN2.setText("");
jtextSN3.setText("");
jtextSN1.requestFocus();
}
} //actionPerformed方法
//思考如何将List组件的数据导出到文本文档中****
} //Listener类


public static void main(String[] args){
SnTest3 st=new SnTest3();
}
}
...全文
258 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
etr_bruce 2017-07-09
  • 打赏
  • 举报
回复
update:将List组件获得的数据存储到.txt文档中 运用JFileChooser组件,FileOutputStream对象进行文件存储。 重写FileFilter类的中的public boolean accept(File file)与public String getDescription()方法来过滤文本类型。 详见附件源码
/*条码比对程序*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.io.*;
import javax.swing.filechooser.FileFilter;


public class SnTest4 {
	JFrame jf=new JFrame();
	private JPanel jp=new JPanel();										//创建JPanel对象(中间容器)

	private JLabel[] jlArray={new JLabel("产 品 条 码"),new JLabel("保修卡条码"),new JLabel("外 箱 条 码")};
	JLabel jlSum=new JLabel();											//创建显示扫描后数据总笔数的标签
	private JTextField jtextSN1=new JTextField();						//创建产品条码文本框
	private JTextField jtextSN2=new JTextField();						//创建保修卡条码文本框
	private JTextField jtextSN3=new JTextField();						//创建外箱条码文本框
	private List info=new List(20);										//创建List组件
	private JButton filesave=new JButton("存储文件");
	private JLabel label=new JLabel("",JLabel.CENTER);
	JFileChooser fileChooser=null;

	//构造方法
	public SnTest4(){
		fileChooser=new JFileChooser("E:\\java_work");							//选择文件目录的初始位置
		fileChooser.addChoosableFileFilter(new TXTFileFilter("java"));
		fileChooser.addChoosableFileFilter(new TXTFileFilter("txt"));			//addChoosableFileFilter方法加入欲过滤的类型
		
		jp.setLayout(null);												//设置中间容器的Layout为空
		//jp.setBorder(BorderFactory.createTitledBorder(label.getText()));
		jlArray[0].setBounds(30, 20, 80, 26);							//设置标签位置
		jp.add(jlArray[0]);												//添加标签到中间容器里
		jlArray[1].setBounds(30, 60, 80, 26);
		jp.add(jlArray[1]);
		jlArray[2].setBounds(30, 100, 80, 26);
		jp.add(jlArray[2]);


		jtextSN1.setBounds(100,20,180,26);
		//jtextSN1.setText("219801A0E0173000016");
		jp.add(jtextSN1);
		jtextSN2.setBounds(100,60,180,26);
		jp.add(jtextSN2);
		jtextSN3.setBounds(100,100,180,26);
		jp.add(jtextSN3);
		info.setBounds(100, 140, 180, 320);
		jp.add(info);
		jlSum.setBounds(100,465,80, 26);
		jp.add(jlSum);

		filesave.setBounds(180,465,100,26);
		jp.add(filesave);											//?存储文件实现按钮				
		

		//注册事件监听者
		jtextSN1.addActionListener(new Listener());
		jtextSN2.addActionListener(new Listener());
		jtextSN3.addActionListener(new Listener());
		filesave.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){					//实现存储文件按钮功能
				File file=null;
				int result;
				/***实现“存储文件”按钮文件功能***/
				if(e.getActionCommand()=="存储文件"){
					result=fileChooser.showSaveDialog(jf);
					file=null;
					//String fileName;
					//当用户没有选择文件,而是自己键入文件名称时,系统会自动以此为文件名建立新文件
					if(result==JFileChooser.APPROVE_OPTION){
						file=fileChooser.getSelectedFile();
						//label.setText("你选择存储的文件名称"+file.getName());
						jp.setBorder(BorderFactory.createTitledBorder("你选择存储的文件名称"+file.getName()));
					}else if(result==JFileChooser.CANCEL_OPTION){
						//label.setText("您没有选择任何文件");
						jp.setBorder(BorderFactory.createTitledBorder("您没有选择任何文件"));
					}
				}
				//保存文件需要用到输入输出流的知识,代码如下
				FileOutputStream fileOutStream=null;
				//使用FileOutputStream写入文件,在这个范例中写文件的方式是将之前内容清除并重新写入
				//若想把新增的内容加在原有的文件内容后,可以使用FileOutStream(String name,Boolean append)构造函数
				if(file!=null){
					try{
						fileOutStream=new FileOutputStream(file,true);		//将新增的内容加在原有的文件内容后
					
					}catch(FileNotFoundException fe){
						label.setText("File Not Found");
						return;
					}
					
					try{
						for(String content:info.getItems()){				//list组件是以数组方式存放数据,所以要使用到for循环
							content+="\r\n";								//每一条数据后加入回车换行
							fileOutStream.write(content.getBytes());
						}
					}catch(IOException ioe){
						label.setText("文件写入错误");
					}
					
					finally{
						try{
							if(fileOutStream!=null)
								fileOutStream.close();
						}catch(IOException ioe2){}
					}
					
				}
			}
		});

		jf.add(jp);														//将中间容器添加到顶层窗体中								
		jf.setTitle("条码比对程序");										//设置顶层窗体标题
		jf.setResizable(false);											//设置顶层窗体最大化不可见
		jf.setBounds(500, 100, 320, 530);								//设置顶层窗体位置和大小
		jf.setVisible(true);											//设置顶层窗体显示可见
	}

	public class Listener implements ActionListener{					//定义监听者类,并实现接口中的方法进行比对操作

		public void actionPerformed(ActionEvent e){						//实现actionPerformed()方法处理事件
			String s1="",s2="",s3="";
			if(info.getItemCount()>99){
				JOptionPane.showMessageDialog(null, "对不起,已超过100行!");
				jtextSN1.setText("");
				jtextSN2.setText("");
				jtextSN3.setText("");
				return;
			}
			s1=jtextSN1.getText();
			s2=jtextSN2.getText();
			s3=jtextSN3.getText();
			int line=info.getItemCount();
			//条码输入光标移位,条码比对**
			if(s1.equals("")){								//判断光标是否定位在待输入的空白文本框内
				jtextSN1.requestFocus();
			}else if(s2.equals("")){
				jtextSN2.requestFocus();
			}else if(s3.equals("")){
				jtextSN3.requestFocus();
			}else if(s1.equals(s2)&&s2.equals(s3)){			//判断扫入的条码是否一致
				//将文本框中内容转换为大写
				String sn=s3.toUpperCase();

				for(int i=0;i<info.getItemCount();i++){		//判断已录入过的条码是否与正在比对的条码重复
					if(info.getItem(i).equals(sn)){			//如果重复,弹出警告对话框,且跳出循环
						JOptionPane.showMessageDialog(null, "条码["+info.getItem(i)+"]重复!","警告",JOptionPane.WARNING_MESSAGE);
						jtextSN1.setText("");
						jtextSN2.setText("");
						jtextSN3.setText("");
						jtextSN1.requestFocus();
						return;								//跳出程序
					}
				}

				info.add(sn);								//如果不重复,则将比对后的条码录入List
				jlSum.setText("共扫入"+(line+1)+"行");
				jtextSN3.setText("");
				jtextSN2.setText("");
				jtextSN1.setText("");
				jtextSN1.requestFocus();
			}else{
				JOptionPane.showMessageDialog(null, "条码比对错误!","错误",JOptionPane.ERROR_MESSAGE);
				jtextSN1.setText("");
				jtextSN2.setText("");
				jtextSN3.setText("");
				jtextSN1.requestFocus();
			}	
		}													//actionPerformed方法
		//思考如何将List组件的数据导出到文本文档中****
		
	} 														//Listener类
	
	

	public static void main(String[] args){
		SnTest4 st=new SnTest4();
	}
}

//定义过滤文件类型类
class TXTFileFilter extends FileFilter{
	String ext;

	public TXTFileFilter(String ext) {
		this.ext=ext;
		// TODO Auto-generated constructor stub
	}

	public boolean accept(File file) {
		// TODO Auto-generated method stub
		if(file.isDirectory()){
			return true;
		}
		String fileName=file.getName();
		int index=fileName.lastIndexOf('.');
		if(index>0&&index<fileName.length()-1){
			String extension=fileName.substring(index+1).toLowerCase();
			if(extension.equals(ext))
				return true;
		}
		return false;
	}

	public String getDescription() {
		// TODO Auto-generated method stub
		if(ext.equals("txt"))
			return "TXT Source File(*.txt)";
		if(ext.equals("java"))
			return "JAVA Source File(*.java)";
		return "";}

}

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧