You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse WindowBuilder创建JTable调用getSelectedRow始终返回-1问题求助

问题原因

  • 核心错误:定时器任务执行时每次都通过new Frontend()创建全新的窗口实例,你操作选中行的是已经显示在桌面的旧实例,两个实例互相独立,新实例的表格从未被操作过,自然永远返回-1。
  • 次要错误:你使用的java.util.Timer的任务执行在非Swing事件调度线程(EDT)中,直接访问Swing组件属于线程不安全操作,即便实例正确也可能出现返回值错误、界面卡顿等异常。
  • 你提供的新增行逻辑没有问题,和当前返回-1的故障无关。

修复方案

  1. 保留当前正在显示的Frontend窗口实例的引用,不要在定时器任务中重复创建新实例。
  2. 优先使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:45:05