Проблема с обновлением JButtons при переключении между вкладками JTabbedPane

Итак, проблема, с которой я сталкиваюсь, вероятно, проще всего показана на картинках:

Это первое изображение представляет собой снимок игрового поля введите здесь описание изображения

Каждый из этих квадратов — «Plots» — является JButtons.

При нажатии одной из кнопок JButton над дисплеем Plot, т. е. «Купить продукцию», произойдет соответствующее действие:

введите здесь описание изображения

Все идет нормально.

Но при переключении на любую из других вкладок — «Товары» или «Помощь» — и переключении обратно на вкладку «Игра» мне удавалось только это:

введите здесь описание изображения

Я думаю, что шаги, которые я предпринимаю для обновления отображения сюжета после покупки продуктов, должны нормально работать для обновления отображения после переключения вкладок, но это не так.

Вот код, который я использую для обновления дисплея при покупке продуктов:

buyProduce.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            try {
                buyProduce();
                plot_panel.removeAll();
                createPlots();
                labelStore.get("Cash_Label").setText(game.roundedWorth());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (BankruptException e) {
                JOptionPane.showMessageDialog(frame,
                        "Bankrupt after attempt to purchase Produce");
            }
        }
    });

Я пытался сделать это с помощью ChangeListener на TabbedPane, только чтобы отображение графика стало «пустым», как на 3-м рисунке.

tabbedPane.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent arg0) {
            plot_panel.removeAll();
            createPlots();
        }

    });

Тем не менее, дисплей остается «пустым», пока я не выполняю — с помощью одной из кнопок над дисплеем — действие, которое обновляет дисплей.

(Если, например, когда дисплей «пустой», я «Куплю продукты», все выглядит так, как должно.)

Может ли кто-нибудь здесь сказать, из того, что я разместил, что происходит не так и где?

Я рад опубликовать больше кода, если это необходимо, но подумал, что должен попытаться сделать это как можно более аккуратным.

Заранее спасибо, Дуг.

РЕДАКТИРОВАТЬ: я не хотел тратить время людей на плохой MCVE, поэтому здесь - http://1drv.ms/1Hx5sA1 - это ссылка на сжатую папку со всем содержимым.

Если люди не хотят в этом разбираться, я попробую переключиться на JTable.


person AUS_Doug    schedule 22.11.2014    source источник
comment
Вы должны revalidate() и repaint() plot_panel после удаления и добавления компонентов. Но я почти хочу сказать, что, возможно, нам следует поискать другой дизайн, но просто недостаточно информации, чтобы отталкиваться от нее.   -  person Paul Samsotha    schedule 22.11.2014
comment
Только что попробовал вставить plot_panel.revalidate() и plot_panel.repaint() после plot_panel.removeAll(); и после createPlots(); (а затем оба), но без изменений. Должен ли я вставить свой (довольно большой) класс в OP или какой-то внешний, например PasteBin?   -  person AUS_Doug    schedule 22.11.2014
comment
Для получения дополнительной помощи опубликуйте минимальный, полный и проверяемый пример. Это просто слишком мало кода, чтобы уйти.   -  person Paul Samsotha    schedule 22.11.2014
comment
Рассматривали ли вы возможность использования JTable?   -  person MadProgrammer    schedule 22.11.2014
comment
@MadProgrammer Я этого не делал, нет; Мой первоначальный план состоял в том, чтобы сделать графики «кликабельными» — чтобы получить их координаты — и я решил, что JButton (или JLabel) будет самым простым способом сделать это. Если я не могу заставить это обновление работать, то я, вероятно, перейду на JTable (предполагая, что вы можете отображать разные изображения в каждой ячейке?)   -  person AUS_Doug    schedule 22.11.2014
comment
Вы можете отображать все, что хотите, в каждой ячейке, в этом суть   -  person MadProgrammer    schedule 22.11.2014
comment
@MadProgrammer Хорошо, спасибо   -  person AUS_Doug    schedule 22.11.2014


Ответы (1)


При удалении из plot_panel и повторном создании вызовите

plot_panel.updateUI();
person javapadawan    schedule 22.11.2014
comment
updateUI, вероятно, наихудший метод, который вы могли бы использовать, и он имеет мало общего с обновлением макета пользовательского интерфейса, и все, что связано с перезагрузкой компонента, его внешний вид, что невероятно неэффективно. Как утверждает @peeskillet, OP, вероятно, потребуется вызвать revalidate, а затем repaint - person MadProgrammer; 22.11.2014