CardLayout с переключением JFreeChart не работает

Я сталкиваюсь с некоторыми проблемами с JFreeChart, здесь я объяснил, что я создаю: Случайные ошибки при смене серий с помощью JFreeChart. Но теперь у меня есть другой вопрос. Я должен ChartPanel в CardLayout переключаться между графиками, когда я нажимаю на панель с вкладками. Я пробовал это с обычным JPanel (public class JPaintablePanel extends JPanel. Он показывает некоторую кнопку с другим именем в зависимости от вкладки), и она работает хорошо. Но то же самое с public class JPaintablePanel extends ChartPanel не работает, оно показывает только один граф. Можете ли вы сказать мне, как заставить ChartPanel переключать и сохранять данные?

http://pastebin.com/THuvGan5 ChartPanel

http://pastebin.com/Br2swZiC CardLayout

Ответ 1

Вам не нужно смешивать панели с вкладками и макеты карт. Просто разместите отдельный ChartPanel на каждой вкладке.

JTabbedPane tabs = new JTabbedPane();
tabs.add("Graph 1", new JPrintablePanel());
tabs.add("Graph 2", new JPrintablePanel());

Вам не нужно писать какой-либо код для работы с переключениями вкладок, Swing будет обрабатывать это для вас. ChartPanels также автоматически обновится, если вы добавите данные.

Ответ 2

Извините, не прояснилось: JTabbedPane, ChartPanel и JPanel лежат в одной и той же сетке.

Это не ясно из вашего вопроса, но это может помочь позволить иерархии сдерживания отражать предполагаемое использование. Если каждая карта предназначена для размещения трех панелей, пусть каждый CardPanel содержит три соответствующих поля. Передайте любые требуемые параметры в конструкторе CardPanel. Добавьте экземпляры этих карт в CardLayout, как показано в примерах, найденных здесь здесь и здесь. Используйте шаблон стратегии, чтобы дать отдельным картам конкретную реализацию общего интерфейса.

public class CardPanel extends JPanel {

    private JTabbedPane tabPane;
    private ChartPanel chart;
    private JPanel panel;

    public CardPanel(Dataset dataset, Context context, ...) {
        super(new GridLayout(0, 1));
        // initialize fields ...
        this.add(tabs);
        this.add(chart);
        this.add(panel);
    }
    ...
}