Java课设中的问题以及解决方案(二)

windowbuilder安装和使用

类比于在VS stdio上开发c#,eclipse有对应的GUI开发工具,也就是windowbuilder.
当然同类型的工具也有NetBeans等.编程虽然有趣,但是本身是一件很麻烦的事情,所以我就只选择了普遍评价较高的windowbuilder作尝试.
windowbuilder主页

S1:安装插件(install new software)(这里注意活用help功能)
S2:将 https://download.eclipse.org/windowbuilder/latest/ 复制到work with一栏中
S3:一路点击next全选安装即可

安装完毕会提示重启,重启完成,在new->other->windowbuilder->swing Designer->Application Window中创建项目.

可以在代码文件的左下角发现,多了一个Desgin选项,至此,windowbuilder安装完成.

多线程进阶

(一)中有提到的一个问题.
当时虽然成功创建了进度条,不过发现主窗体的线程钳制了分线程的运行(也就是说,主窗体线程运行完毕之前,分线程不会共享主线程的资源)

纠结了半个晚上,于是今天突发奇想,将分线程对主线程资源的操作转移到备胎线程之中,这样本质上大家都是分线程,也就不会出现次序问题了.

多说无益,上代码

button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new labelControl1(matrixLoder).start();
				new labelControl2(contentLoder).start();
				new labelControl3(probilityLoder).start();
				resultOf01Button.setEnabled(false);
				resultOfcontentButton.setEnabled(false);
				resultOfprobilityButton.setEnabled(false);
				chartsOfcontentButton.setEnabled(false);
				chartsOfProbilityButton.setEnabled(false);
				visable_init(true);
				
				new PostThread( file_load_res, inputString, arr, resultOf01Button, resultOfcontentButton, chartsOfcontentButton, chartsOfProbilityButton, resultOfprobilityButton).start();
			}
            //将post命令放在新的线程中并发执行
		});

效果图展示

在这里插入图片描述

jtable小结

在一种大概地提到过JTable这个组件.
本次的课程设计中,有非常多的表格需要展示,有的是从服务器接收到的json数据转jtable,也有将本地的csv文件转化为jtable,还有将textarea中的输入文本转化为jtable,所以目前对于这个组件略有心得(笑

jtable的初始化

常用的三种初始化方式:

  • JTable()
  • JTable(int a,int b) //a行b列
  • JTable(Object a[][],Object b[]) //a存放数据表,b存放列名

一般我采用的是new jtable(Object a[][],Object b[])这样的初始化方式.

json2jtable

JSONObject js = new JSONObject();
		js = JSON.parseObject(s1);
		
		
		HashSet<String> row =new HashSet<String>();
		List<String> cols = new ArrayList<>(js.keySet());
		List<String> rows = new ArrayList<>(js.getJSONObject(cols.get(0)).keySet());
		
		
		
		a = new Object[rows.size()][cols.size()];
		
		for (int i = 0; i < cols.size(); i++) {
			JSONObject eachcol = js.getJSONObject(cols.get(i));
			for (int j = 0; j < rows.size(); j++) {
//				System.out.println(eachcol.getString(rows.get(j)));
				a[j][i] = eachcol.getString(rows.get(j)); 
			}
		}
		
		tb = new JTable(a,cols.toArray());

		Container con = getContentPane();
	
		getContentPane().add(new JScrollPane(tb),BorderLayout.CENTER);
	
		tb.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		
		setTitle(name);
		setSize(10000,10000);
		setVisible(true);
		validate();
		setDefaultCloseOperation(HIDE_ON_CLOSE);

csv2jtable

Object[] columnnames;
		CSVReader CSVFileReader = null;
		try {
			CSVFileReader = new CSVReader(new FileReader(filepath));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		List myEntries = null;
		try {
			myEntries = CSVFileReader.readAll();
		} catch (IOException | CsvException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		columnnames = (String[]) myEntries.get(0);
		DefaultTableModel tableModel = new DefaultTableModel(columnnames, myEntries.size()-1); 
		int rowcount = tableModel.getRowCount();
		for (int x = 0; x<rowcount+1; x++)
		{
		    int columnnumber = 0;
		    // if x = 0 this is the first row...skip it... data used for columnnames
		    if (x>0)
		    {
		        for (String thiscellvalue : (String[])myEntries.get(x))
		        {
//		        	System.out.println(thiscellvalue);
		            tableModel.setValueAt(thiscellvalue, x-1, columnnumber);
		            columnnumber++;
		        }
		    }
		}
		System.out.println(tableModel);
		return tableModel;

jtextarea2jtable

if (e.getDocument() == textPane.getDocument()) {
					Document doc = e.getDocument();
					String str = null;
					try {
						str = doc.getText(0, doc.getLength());
					} catch (BadLocationException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					arr = str.split("\\s+");
					
					if (arr.length %2 == 0) {
						Object [] columnnames = {"处方名","药名"};
						Object a[][];
						
						a = new Object[arr.length/2][2];
						
						for (int j = 0; j < arr.length; j++) {
							a[j/2][j%2] = arr[j];
						}
						
						table_1 = new JTable(a,columnnames);
						table_1.setBounds(86, 285, 678, 251);
						table_1.setEnabled(false);
						jContentPane.add(table_1);
						table_1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
					}
					
				}

一些属性

Q:如何添加滚动条?
A:见(一)

Q:表格想变为不可选?
A: JTable.setEnabled(false);

Q:表格变为只读?
A: 重载 JTable.isCellEditable(row, column), 令其始终返回false.

监听设置

解决问题

监听textarea中输入的值,并在下方生成对应的数据表

解决方案

textPane.getDocument().addDocumentListener(new DocumentListener() {
			
			@Override
			public void removeUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void insertUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub
				if (e.getDocument() == textPane.getDocument()) {
					Document doc = e.getDocument();
					String str = null;
					try {
						str = doc.getText(0, doc.getLength());
					} catch (BadLocationException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					arr = str.split("\\s+");
					
					if (arr.length %2 == 0) {
						Object [] columnnames = {"处方名","药名"};
						Object a[][];
						
						a = new Object[arr.length/2][2];
						
						for (int j = 0; j < arr.length; j++) {
							a[j/2][j%2] = arr[j];
						}
						
						table_1 = new JTable(a,columnnames);
						table_1.setBounds(86, 285, 678, 251);
						table_1.setEnabled(false);
						jContentPane.add(table_1);
						table_1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
					}
					
				}
			}
			
			@Override
			public void changedUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub
				
			}
		});

补充说明

  • removeUpdate 当删除发生时
  • insertUpdate 当插入发生时
  • changedUpdate 当发生变化时

处于性能考虑,一般选择只使用insert

这里涉及到一个问题,就是正则化是在监听时完成还是在上传时完成.

处于性能考虑,我选择再上传时统一进行正则化.
在这里插入图片描述

后记

    就这样,看似徒劳的事,最终却结出了果实,一件失败的事情会变成对人类的大声疾呼,要求人类将精力集中到还未完成的事业当中去;在卓越的对抗中,壮烈的死亡可以生出新的生命,一次毁灭也可以生出攀登高峰的奋起意志。因为在偶然的成就和轻易获得的成功中,只有雄心壮志才能点燃火热的心,一个人虽然在与不可战胜的、占据优势的命运的斗争中毁灭了自己,但他的心灵却变得无比高尚。这些在所有时代都最最伟大的悲剧,作家可能只会偶尔创作,但现实生活却早已将其演绎了千百遍。
     -- 茨威格<人类群星闪耀时>
  • zxj,这个人虽然一事无成,但是只要他每天都开心地活着,遇见喜欢的人,做喜欢的事,就足够了.
  • <瓦尔登湖>…
  • 即使是一个人…享受的阅读的时光,好久好久…
发布了9 篇原创文章 · 获赞 6 · 访问量 1018

猜你喜欢

转载自blog.csdn.net/Acher_zxj/article/details/103189098
今日推荐