Макет карты с разными классами

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Etiam et fermentum dui. Ut orci quam, ornare sed lorem sed, hendrerit.

2 ответа

Решение

Код, который я дал, буквально взят из этого урока.

Так почему же ваши переменные PANEL1 и PANEL2 не имеют значений? Как вы ожидаете, что это будет работать, если вы не укажете название карты??? Как вы ожидаете, что что-то будет работать, если вы не копируете рабочий код? Почему мы должны предоставлять рабочий код, если вы даже не можете следовать коду из учебника? Как вы думаете, почему любой предоставляемый нами код будет другим?

но я не понимаю, как сделать каждую карту другого класса.

Нет никакой разницы. Если вы хотите отобразить карту, вам нужно знать название карты, которую вы хотите отобразить.

Прямо сейчас вы используете:

JPanel p1 = new JPanel();
cards.add(p1, PANEL1);

Так что, если панель находится в другом классе, тогда код будет:

JPanel p1 = new SomeCustomPanel()
cards.add(p1, PANEL1);

Если вы хотите, чтобы весь код находился на отдельной панели, вам потребуется получить менеджер макета из родительской родительской панели, чтобы код в ActionListener каждой панели мог выглядеть примерно так:

JPanel parent = childPanel.getParent();
CardLayout layout = (CardLayout)parent.getLayout();

Теперь у вас есть доступ к менеджеру раскладок, и вы можете переключать карточки, если вы знаете название каждой карточки. Как вы называете каждую карту и как вы назначаете название карты, зависит от вас.

Редактировать:

public class SomeCustomPanel extends JPanel
{
    public SomeCustomPanel
    {
        add( new JLabel("I'm a JLabel") );
        JButton button = new JButton("Switch Panel");
        add(button);
        button.addActionListener(...); // add ActionListener to swap cards
    }
}

Редактировать:

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

Когда вы используете ActionListener, источником ActionEvent будет JButton. Итак, с помощью кнопки, сгенерировавшей ActionEvent, вы можете вернуться вверх по цепочке родительский / дочерний, пока не найдете панель с помощью CardLayout.

Так что ваш код будет больше похож на:

JButton button = (JButton)e.getSource();
JPanel someCustomPanel = (JPanel)button.getParent();
JPanel cardLayoutPanel = (JPanel)someCustomPanel.getParent();
CardLayout layout = (CardLayout)cardLayoutPanel.getLayout();
layout.show(cardLayoutPanel, "...");

Теперь, когда у вас есть менеджер раскладки, вам просто нужно знать название карты, которую вы хотите отобразить

Вы установили диспетчер макетов JPanel как CardLayout. Таким образом, карта может быть любым классом, который может быть добавлен в JPanel, т.е. любым Компонентом или подклассом Компонента.

Другие вопросы по тегам