目录

 

​项目场景:​

​问题描述:​

​解决方案:​

​        1、如何实现表格实时更新及覆盖问题​

​2、如何处理JButton点击后,JLabel要正确变化​

​最后项目效果:​


项目场景:

有学妹找我代写项目,实验内容如下图2个页面:

数据处理不是很大,前端页面绘制对我来说是个麻烦(我对Java Swing学习过一次大型项目--五子棋的项目而已)

Java Swing学习:关于JButton,JLabel,JTabel的学习_数据

Java Swing学习:关于JButton,JLabel,JTabel的学习_java_02

问题描述:

主要是第二副图遇到了麻烦,我困惑了很久

1.、如何使表格实时更新

2、如何使信息加载显示区也随着变化

3、以上需要用什么组件 (选择表格用JTable,显示区用JLabel)

4、如何处理JTable的问题:

JTable显示数据,当我点击更新后,显示的数据是修改后的数据,可再点击被修改的列时,又成了未修改前的数据

Java Swing学习:关于JButton,JLabel,JTabel的学习_开发语言_03

真实是这样的,但点击下面后,

Java Swing学习:关于JButton,JLabel,JTabel的学习_数据_04

5、如何处理JButton和JLabel的问题:

点击JButton,修改JLabel的值为“正在搜索”,等表格数据更新之后,再修改JLabel的值为相应的反应,但没有等到“正在搜索”的效果,就直接最后反应了


解决方案:

1、如何实现表格实时更新及覆盖问题

(1) 定义静态变量 表格、滚动条和表格面板

public static  JTable table = new JTable();
public static JScrollPane jScrollPane=new JScrollPane();
public static JPanel tablePanel = new JPanel(new BorderLayout());

(2)表格加入滚动条,再加入面板

//tablePanel.add(new JScrollPane(table), BorderLayout.CENTER);
jScrollPane = new JScrollPane(table);
tablePanel.add(jScrollPane, BorderLayout.CENTER);

(3)在修改表格后,更新表格面板、滚动条和表格(表格插回tabelPanel的jScrollPanel)

Java Swing学习:关于JButton,JLabel,JTabel的学习_java_05

注意:问题 4:如何处理JTable的问题

出现的原因是我们没有删除,再重新添加,需要如图步骤:

删除滚动条(其实连table都一起删了),然后2个一起new,再插回去tablePanel,其实这是个三层结果,把底下2层处理了,顶层显示就不会出现下面这个情况:

JTable显示数据,当我点击更新后,显示的数据是修改后的数据,可再点击被修改的列时,又成了未修改前的数据

当然,我们也可以不删除(我之前不知道的时候的做法)--直接不给编辑,真就给看看而已

table.setEnabled(false); // 学习点1:这里处理了选中空白行,显示上一次多余的结果

之前还查到一个方法:继承表格类,修改为不可编辑,但是这个方法其实不太好,点击还是会复现

table.setEnabled(false); // 学习点1:这里处理了选中空白行,显示上一次多余的结果
table = new JTable(new DefaultTableModel(playerInfo,tages){//继承重写编辑
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
});

2、如何处理JButton点击后,JLabel要正确变化

首先,肯定要监听器

Java Swing学习:关于JButton,JLabel,JTabel的学习_java_06

其次,需要在查询那里设置“正在飞速加载中”

Java Swing学习:关于JButton,JLabel,JTabel的学习_后端_07

最后,也是最重点的, 对操作反应的延迟

原来,我想直接在应有的操作后直接加入

loadingLabel.setText(info);// public static  JLabel  loadingLabel = new JMyLabel(); 继承JLabel改动了样式的

但每次都是只看到最后的info,前面的被覆盖了。

我查了相关博客文档和看了setText源码:

文档讲JLabel在JButton点击后,需要等JButton运行结束后,才会处理,而我程序这里,在JButton调用后,很快就执行了setText(info),时间太短了,我们看不出区别

 网址:​​https://www.iteye.com/blog/kesandfish-296742​

setText源码关键部分:

Java Swing学习:关于JButton,JLabel,JTabel的学习_开发语言_08

我直接setText后都没用,那在程序再加下面的的重画也是没用

revalidate();   repaint();

既然因为太快,那我加个延时总可以了吧。事实上,我加了一分钟都没作用。(仅仅我电脑实验结果)

我后来看到csdn的一个问答:

Java Swing学习:关于JButton,JLabel,JTabel的学习_后端_09


但一开始不理解try里面是放我程序哪部分

后来想通了,就是返处理那个部分,可以开启个新线程,这个新启动一定比较慢了,涉及操作系统调度,它应该可以等到我JButton 那个正在运行的线程结束(人为加点延时就行了)

代码如下:

public void sleeps(double n,String info){//学习点2:用线程解决绘图时,JLabel需要等待JButton作用完才起作用
new Thread(() -> {
try {
Thread.sleep((long) (n * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
loadingLabel.setText(info);
}
}).start();
}

最后项目效果:

Java Swing学习:关于JButton,JLabel,JTabel的学习_实时更新_10

Java Swing学习:关于JButton,JLabel,JTabel的学习_数据_11

Java Swing学习:关于JButton,JLabel,JTabel的学习_后端_12