Эксперты, нужна помощь.
Я создал JFrame, скажем, в классе 'A' и добавил JTabbedPane с использованием среды IDE NetBeans, а также добавил первую JPanel в эту JTabbedPane. На этом JPanel у меня есть JCheckbox, который добавляет и удаляет новую вкладку (экземпляр JPanel), основываясь на событии check / unchecked. Добавляемая и удаляемая панель определяется в другом, скажем, классе «B», который расширяет JPanel. Эта JPanel имеет задачу таймера, которая выполняется с заданным интервалом c, получает некоторые данные из ресурса 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 ( это & это ), и было подтверждено, что, как только для ссылок установлено значение NULL, G C позаботится этого В этом случае я не уверен, как установить нулевую ссылку, так как я просто удаляю панель из JTabbedPane. Я следил за своим приложением в течение достаточно долгого времени, и я не видел, чтобы G C очищал его. Правильно ли я смотрю на это? Какой правильный и рекомендуемый способ удаления / аннулирования панели, удаленной из JTabbledPane?