gpt4 book ai didi

java - 如何不仅从 JTabbedPane 中删除 JPanel,而且还优雅地处置 JPanel 实例?

转载 作者:行者123 更新时间:2023-12-02 08:41:53 24 4
gpt4 key购买 nike

专家,需要帮助。

我已经在“A”类中创建了 JFrame,并使用 NetBeans IDE 添加了 JTabbedPane,还向该 JTabbedPane 添加了第一个 JPanel。在此 JPanel 上,我有 JCheckbox,它根据选中/未选中事件添加和删除新选项卡(JPanel 的实例)。添加和删​​除的面板是在扩展 JPanel 的另一个类“B”中定义的。这个 JPanel 有一个计时器任务,它以特定的时间间隔运行,从 REST 资源中获取一些数据并更新 JPanel 主体中的内容,如下所示:

private void refreshAgentUtilizationData() {
TimerTask updateAgentDetailsTask = new TimerTask() {
@Override
public void run() {
agentObj.updateData();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
memChart.repaint();
System.out.println("This is from Agent monitor timer task...");
}
});
}
};
agentMonTimer.scheduleAtFixedRate(updateAgentDetailsTask, 0, master_pollingInterval);
}

执行的 JCheckBox 操作(在“A”类中)如下所示,

首先是一些细节:

AgentMon_ChartsUI = 扩展 JPanel 并添加到 JTabbedPane 的类,即 B 类

agentMonTabs = JTabbedPane 位于 A 类

    private void agentMonSwitchActionPerformed(java.awt.event.ActionEvent evt) {                                               
if (agentMonSwitch.isSelected()) {
AgentMon_ChartsUI agentChartPane = new AgentMon_ChartsUI();
Icon agentIcon = new javax.swing.ImageIcon(getClass().getResource("/resources/abc.png"));
agentMonTabs.addTab("Agent runtime monitor", agentIcon, agentChartPane);
agentMonTabs.setSelectedIndex(agentMonTabs.indexOfTab("Agent runtime monitor"));
} else {
agentMonTabs.remove(agentMonTabs.indexOfTab("Agent runtime monitor"));
}
}

问题是:我无法找到优雅的方法来处置 JPanel 实例,该实例在复选框的取消选中事件中被删除。当我取消选中它时,我可以看到该选项卡已成功删除,并且看起来面板现在已经消失了,但我可以看到 System.out.println... 仍在执行中计时器的工作。这意味着 Jcheckbox > Uncheck 只是删除选项卡,但不会释放它。

我检查了 StackOverflow 上的其他问题( thisthis ),并确认一旦引用设置为 null,GC 就会处理它。我不确定在这种情况下,应该如何将引用设置为 null,因为我只是从 JTabbedPane 中删除面板。我监控我的应用程序很长一段时间,但没有看到 GC 清除它。 我是否正确地看待它?处理/取消从 JTabbledPane 中删除的面板的正确和推荐方法是什么?

最佳答案

您可以采用多种方法来处理此问题。最简单的方法之一是重写 JPanelremoveNotify 方法。当组件从其父容器中删除时,就会调用此函数。

@Override
public void removeNotify() {
super.removeNotify()
agentMonTimer.cancel();
agentMonTimer.purge();
agentMonTimer = nil;
}

注意:如果 Timer 是共享的,您可以取消 TimerTask,但您需要维护一个引用当你创建它时它

关于java - 如何不仅从 JTabbedPane 中删除 JPanel,而且还优雅地处置 JPanel 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com