Issue note
操作Swing GUI 组件时,遇到一个问题,比如在前端设置了一个表格,表格里面的数据是后台动态生成的,发现却更新不了。
我尝试猜测问题的原因:
- 我把表格嵌套在一个面板B,面板B又嵌套在面板A,所以需要刷新面板A才行,也不全对;
- 线程问题,需要在一个特定的UI子线程才能更新,也不全对;
- 后来发现是操作的对象引用不对导致,下面是解决方案;
Solve It
核心原则就是:
- 需要操作正确的引用对象
步骤:
- 在创建组件放入主面板的时候,把这个创建组件的类变量也存入一个全局变量;
- 后台在使用的时候,就去全局变量里面取;
- 最好开启UI子线程比较安全;
Code 示例
//前端
//B类
public Dashboard() {
//...
}
//后台
定义全局变量存储组件对象的引用
public static Dashboard dashboard;
比如说表格在B类里,而B类嵌套在A类里,必须要在在A类里 创建B类的时候,把这个创建的B类存储进全局变量里,必须是这个指向才有用
// A类
Dashboard dashboard = new Dashboard();
GlobalConfig.dashboard = dashboard;
后台开启一个UI线程也是一个安全的操作
//...
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("dash 111");
// 更新 Dashboard UI - table
// 创建匿名类实现回调接口
IDashboard callback = new IDashboard() {
@Override
public void updateTable(List<DashboardTable> dt) {
System.out.println("execute Dashboard callback!");
dt.add(new DashboardTable(33, "333"));
dt.add(new DashboardTable(44, "444"));
}
};
// 执行包含回调函数的操作
Dashboard dashboard = GlobalConfig.dashboard; //必须是从全局存储这里拿出来的类对象
dashboard.perpormCallback2(callback);
GlobalConfig.mainUI.reprint();
System.out.println("dash 222");
}
});
标签:线程,插件,UI,dashboard,Dashboard,组件,new,Burp
From: https://www.cnblogs.com/mysticbinary/p/17808212.html