2014-11-22 2 views
0

Таким образом, проблема у меня, наверное, проще всего рисункам:Проблема с обновлением JButtons при переключении между вкладками JTabbedPane

Это первая картина выстрел из доски игры enter image description here

Каждый из этих квадратов - «Сюжеты» - это JButtons.

При нажатии одной из указанных выше дисплея участка JButtons - то есть, «Купить произведут» - ассоциированная действие будет происходить:

enter image description here

До сих пор, так хорошо.

Но о переходе на любой из других вкладок - «Товары» или «Справка» - и переключение обратно на вкладку «игры», я только когда-либо были в состоянии иметь это произошло:

enter image description here

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

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

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, только для отображения Plot идти «пустой», как в 3-е изображение.

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

    }); 

Однако дисплей только «пустой», как это, пока я не выполнить - через одну из кнопок, расположенных над дисплеем - действие, которое обновляет дисплей.

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

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

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

Заранее благодарен, Doug.

EDIT: Я не хотел тратить время людей с плохой MCVE, поэтому здесь - http://1drv.ms/1Hx5sA1 - это ссылка на сжатую папку со всеми вещами в ней.

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

+2

Вы должны 'перепроверить()' и 'перекрасить()' 'plot_panel' после удаления и добавления компонентов. Но я почти хочу сказать, может быть, нам стоит искать другой дизайн, но просто недостаточно информации, чтобы уйти. –

+0

Просто попробовал вставить plot_panel.revalidate() и plot_panel.repaint() после plot_panel.removeAll(); и после createPlots(); (а затем и то, и другое), но никаких изменений. Должен ли я вставлять свой (довольно большой) класс в OP, или какой-то внешний, как PasteBin? –

+0

Для получения более полной помощи отправьте [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Это просто путь к небольшому коду, чтобы уйти. –

ответ

0

При удалении от plot_panel и воссоздающий, звоните

plot_panel.updateUI(); 
+2

'updateUI', вероятно, самый худший метод, который вы могли бы использовать, и не имеет никакого отношения к тому, чтобы сделать обновление пользовательского интерфейса его макетом, и все, что нужно сделать, чтобы компонент перезагрузил его внешний вид и состояние, что невероятно неэффективно. Как состояние by @peeskillet, OP, вероятно, нужно будет вызвать 'revalidate', а затем' repaint' – MadProgrammer