星语心愿

技术小白希望在学习过程中有所总结,望大神们批评指正。

关于java中的JTable问题

最近用Java代码写一个界面,主要用来读取txt文档然后显示在窗口里面,由于是技术小白,所以遇到很多问题,现在记下来免得以后再犯。


需求与方法

1、我首先需要一个窗口,当然是写一个类windows继承JFrame,使用的是FlowLayout()布局,在这个布局里面所有的setbounds都是不起作用的。
2、 加入一些按钮和输入框,在输入框中输入文件地址,点击按钮读取txt文档数据,然后以表格形式显示在界面上。
3、在创建监视器所用的类里面设置 public void setaddress(JTextField f) 方法,在窗口类中调用此方法,把输入框中的值传入那个监视器的类。
4、既然点击按钮再读取文件,那么读取文件的方法就写在创建监视器的类里。调用FileReader的对象中的readline方法,把读取的每一行赋值给String类型eachLine = br.readLine()),调用String的方法变成去掉空格的数组: String[] temp = str.split(" +");
5、实现Jtable,这一步相当重要,也是出了很多小bug的地方。既然是点击按钮再显示表格,那就把JTable实现在那个创建监视器的类里。


问题与解答

1、JTable怎么实现?

 JTable table=new JTable(rowData,col);

这里面有两个参数,第一个是二维数组用来存放数据行,第二个是一维数组用来写最上面的表头。但是,数组建立出来都是固定大小的,我现在读取的数据有多有少,采用固定长度显然是不对的。网上有方法,把两个数组改成两个向量Vactor:

Vector<String> col = new Vector<String>();
Vector<Vector> rowData = new Vector<Vector>();

把从文件得到的数组加入rowData:

Vector<String> row = new Vector<String>();
                for(int i = 0; i < temp.length; i++){//遍历每一行

                    row.add(temp[i]);//把每一行都加入row
                }           
                rowData.add(row);//再把每一个row的数据给rowData
                }

文件读取到JTable的任务就算是完成了

2、JTable的显示问题

点击按钮之后,文件读取到JTable然后显示在界面上,那点击按钮之前显示什么?一片空白?实在是太丑了!
怎么解决呢?在windows类里面也设置一个JTable不久行了!不要数据,就留一个表头。
然后…..
点击按钮,窗口里出现了两个JTable表格。
然后我在网上搜问题,没找到方法,那就只能自己想办法。
我想把第二个窗口覆盖在第一个上面,这样就能在同一个位置上显示表格内容了。
但是修改组件位置是不能使用FlowLayout()布局的,于是就把布局设置为null。经过一番调整,新的JTable覆盖在了原来的组件上了,但是整个界面看起来蛮丑的。

3、最小化窗口以后新表格不见了!

最小化窗口再还原以后,新的带数据表格不见了,只有原来的那个表头……
经过大量的检查,我发现没有出错啊,但就是显示不出来了。
直到我无意中修改了新table的位置…..
两个表不再是完美覆盖了,原来最小化窗口再还原之后,新的表格被旧表格压在了下面。我就上网找组件置顶层的方法,都不理想。后来发现了一个叫做 remove()的方法(技术小白问题多多)
既然覆盖那么麻烦,问题还多,不如就在画新表格之前把旧表格组件给 remove掉。
首先在创建监视器的那个类里面设置一个方法,把Windows类里面的JScrollPane对象(JTable是放在JScrollPane里面的)拿过来:

public void getjscroll(JScrollPane jp){
            j=jp;
        }

在actionPerformed方法里面remove掉

4、点击按钮以后,表格全都不见了

点击按钮以后,表格被remove掉了,新的表格没有显示出来。
试了不少办法,原来是没写setVisible(true);

5、点两次按钮出现了两个表格!

我辛辛苦苦的要去掉表格,现在居然又出现了!根据代码,就算我按几次按钮,原来的表格不是都得remove掉吗?还得重新检查代码。
问题出现在从Windows类传过来的JScrollPane对象上。每new一次就会产生新的对象,然而每次执行代码,remove的都是第一次从Windows类里传过来的对象,导致新的JScrollPane组件不能被移掉。
所以在 actionPerformed方法中需要一条非常重要的的代码:

j=jScrollPane; 

这里的jscrollPane是新的表格用到的JScrollPane对象。


一切问题都搞定了!!!!!


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35068075/article/details/79949441
个人分类: java
上一篇C语言实现冒泡排序
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭