Eclipse WindowBuilder创建JTable调用getSelectedRow始终返回-1问题求助
问题原因
- 核心错误:定时器任务执行时每次都通过
new Frontend()创建全新的窗口实例,你操作选中行的是已经显示在桌面的旧实例,两个实例互相独立,新实例的表格从未被操作过,自然永远返回-1。 - 次要错误:你使用的
java.util.Timer的任务执行在非Swing事件调度线程(EDT)中,直接访问Swing组件属于线程不安全操作,即便实例正确也可能出现返回值错误、界面卡顿等异常。 - 你提供的新增行逻辑没有问题,和当前返回-1的故障无关。
修复方案
- 保留当前正在显示的
Frontend窗口实例的引用,不要在定时器任务中重复创建新实例。 - 优先使用Swing自带的
javax.swing.Timer执行定时UI相关操作,它的回调默认运行在EDT线程,符合Swing线程安全规范。
修复后的示例代码
替换原有定时器逻辑即可:
// 先拿到你已经创建并显示的Frontend实例,不要new新对象 Frontend displayedFrontend = 你当前打开的窗口实例; // 使用Swing Timer替代util Timer int interval = 250; javax.swing.Timer timer = new javax.swing.Timer(interval, e -> { displayedFrontend.checkActiveBill(); displayedFrontend.checkActiveItem(); }); timer.start();
如果必须使用java.util.Timer,需要将UI操作放到EDT线程执行:
Timer time = new Timer(); // 提前持有已显示的窗口实例 Frontend displayedFrontend = 你当前打开的窗口实例; time.schedule(new TimerTask() { public void run() { // 所有UI相关操作必须包裹在invokeLater中 SwingUtilities.invokeLater(() -> { displayedFrontend.checkActiveBill(); displayedFrontend.checkActiveItem(); }); } }, 250, 250);
内容的提问来源于stack exchange,提问作者PlasmaBlizzardVampire
相关产品推荐
相关产品推荐

