Обновление содержимого одной карты (JPanel) на основе ввода с другой карты в CardLayout

#java #swing #cardlayout

#java #swing #cardlayout

Вопрос:

У меня есть набор JPanels, упорядоченных в CardLayout. Проблема в том, что когда я что-то меняю в одной JPanel, я хочу, чтобы изменения отражались в другой JPanel, которая является картой в той же колоде. У меня есть метод refresh (), определенный для каждого из этих объектов JPanel, но я не могу вызвать их, используя синтаксис, который используется для перемещения карт. (Здесь p — карта-контейнер для колоды карт)

 CardLayout cardLayout=(CardLayout)(p.getMenuCard().getLayout());
cardLayout.show(p.getMenuCard(),"Card name");
  

Я хочу вызвать метод refresh (), но я не знаю, как это сделать в CardLayout. Пожалуйста, помогите.

Комментарии:

1. что вы изменили, добавили или удалили некоторые J-компоненты

2. ваш вопрос не очень ясен. Что касается показанного вами фрагмента кода, если getMenuCard возвращает панель «card», то ее макет не является CardLayout. CradLyout — это макет, используемый родительской панелью ваших панелей card.

Ответ №1:

Если мы предположим, что каждая из ваших панелей «card» реализует интерфейс, который определяет refresh() метод, тогда вы могли бы сделать:

 interface Refreshable {
    void refresh();
}

class Card1 extends JPanel implements Refreshable {...}
...

// Changing the selected card panel
cardlayout.show(deckpanel, "card name");
for (component card: deckpanel.getComponents()) {
    ((Refreshable) card).refresh();
}
  

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

Комментарии:

1. Да, это сработало. Большое вам спасибо. Но я не видел концепцию, которую вы использовали здесь до этого. Вы приводите JPanel к обновляемому типу, а затем вызываете для этого метод refresh().

2. Только что увидел, что забыл настроить возможность обновления реализации панели Card1 в моем примере. Просто исправил это, чтобы сделать код более понятным.

Ответ №2:

У меня есть набор JPanels, упорядоченных в CardLayout. Проблема в том, что когда я что-то меняю в одной JPanel, я хочу, чтобы изменения отражались в другой JPanel, которая является картой в той же колоде. У меня есть метод refresh (), определенный для каждого из этих объектов JPanel, но я не могу вызвать их, используя синтаксис, который используется для перемещения карт. (Здесь p — карта-контейнер для колоды карт)

Одна вещь (CardLayout и замена JPanels) не имеет ничего общего с другой (состояние одного класса меняется на основе состояния другого класса). Что вам нужно, так это чтобы либо класс, вносящий первоначальные изменения, «передавал» эту информацию другому классу, который должен реагировать на изменения, часто путем вызова метода установки из второго класса. Другой вариант — заставить второй класс «извлекать» информацию из первого класса с помощью прослушивателя, возможно, PropertyChangeListener. Но опять же, ни одно из этих решений — или любое другое решение вообще — не имеет ничего общего с CardLayout или сменой представлений.

Для получения более конкретных рекомендаций для вашей текущей ситуации рассмотрите возможность создания небольшого компилируемого и запускаемого приложения, которое не имеет внешних зависимостей (изображений, базы данных и т.д.) И которое демонстрирует вашу проблему, SSCCE, И опубликуйте его здесь .