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

目录

 

项目场景:

问题描述:

解决方案:

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

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

最后项目效果:


项目场景:

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

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

问题描述:

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

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

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

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

4、如何处理JTable的问题:

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

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

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)

注意:问题 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要正确变化

首先,肯定要监听器

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

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

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

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源码关键部分:

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

 revalidate();   repaint();

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

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

 网址:https://ask.csdn.net/questions/192047


但一开始不理解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();
    }

最后项目效果:

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广大菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值