Я второй рекомендацию camickr, но в отношении этого фрагмента кода:
StatisticPanel::paintComponent(Graphics g) {
clearStatisticButton.setEnabled(stat.hasEntries());
minValueLabel.setText(stat.getMinValue());
super.paintComponent(g);
}
В вашем методе paintComponent (первые два метода) есть методы, не относящиеся к рисованию, и это не должно быть как 1) выхотите, чтобы этот метод был максимально простым и быстрым и, следовательно, имел только код, связанный с рисованием, и 2) у вас нет абсолютного контроля над тем, когда вызывается этот метод или даже если он вызывается, и поэтому код, не связанный с рисованием, илогика программы там не принадлежит.По этим причинам я настоятельно призываю вас вывести их оттуда, но вместо этого их следует называть отдельно от paintComponent, но, как и для большинства кода Swing, в EDT.
EDIT 1
Я не профессионал, но как насчет того, если бы вы дали вашей StaticPanel метод, подобный следующему:
public void doMyUpdate() {
if (SwingUtilities.isEventDispatchThread()) {
clearStatisticButton.setEnabled(stat.hasEntries());
minValueLabel.setText(stat.getMinValue());
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
clearStatisticButton.setEnabled(stat.hasEntries());
minValueLabel.setText(stat.getMinValue());
}
});
}
repaint(); // if the paintComponent method has more than just a super call.
}
РЕДАКТИРОВАТЬ 2
Также, пожалуйста, посмотрите наэтот поток: проверка-если-нить-это-необходимо-101 * *