Конкретные: макет карты в Java - PullRequest
0 голосов
/ 01 декабря 2018

У меня быстрый вопрос, на который, я уверен, есть быстрый ответ, но, как ни старайся, я просто не смог его понять.

Итак, я пишу игровой код, который мне нужно отобразитьразные экраны в разное время.Я не знаю, как это сделать, поэтому я решил попрактиковаться с мини-программой.В моей мини-программе мне нужно три экрана: на экране 1 есть кнопка, которая открывает экран 2, на экране 2 есть кнопка, которая открывает экран 3 и экран 3, и кнопка, которая открывает экран 1!:

с небольшим количествомисследования, я смог выяснить, что я мог сделать это с CardLayout.В течение последнего часа я ходил взад-вперед по Интернету, и вот что я мог придумать:

public class DifferentScreensTester extends JFrame implements ActionListener{

    CardLayout cl = new CardLayout();
    Container contentpane = getContentPane();

    JPanel cards = new JPanel();
    JPanel screen1 = new JPanel();
    JPanel screen2 = new JPanel();
    JPanel screen3 = new JPanel();
    JButton screen1b = new JButton("Go to screen 1");
    JButton screen2b = new JButton("Go to screen 2");
    JButton screen3b = new JButton("Go to screen 3");



    //constrcutor
    public DifferentScreensTester() {
        super();

        contentpane.setLayout (cl);

        //add buttons to respective screens
        screen1.add(screen2b);
        screen2.add(screen3b);
        screen3.add(screen1b);

        //add screens to content pane
        contentpane.add(screen1, "Screen 1");
        contentpane.add("Screen 1", screen1);
        contentpane.add("Screen 2", screen2);
        contentpane.add("Screen 3", screen3);

        //action listeners
        screen1b.addActionListener(this);
        screen2b.addActionListener(this);
        screen3b.addActionListener(this);

    }


    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == screen1b) {
            cl.show(screen1, "Screen 1");
        }
        if (event.getSource() == screen2b) {
            cl.show(screen2, "Screen 2");
        }
        if (event.getSource() == screen3b) {
            cl.show(screen3, "Screen 3");
        }

    }




    public static void main(String [] args) {
        //Scanner sc = new Scanner(System.in);

        DifferentScreensTester clmain = new DifferentScreensTester();          
        clmain.setSize(400, 400); 
        clmain.setVisible(true); 
        clmain .setDefaultCloseOperation(EXIT_ON_CLOSE);

    }


}

Первый запуск проходит без сучка и задоринки.Экран 1 открывается автоматически с кнопкой 2. Вот изображение того, что я вижу. Однако, как только я нажимаю на кнопку, я получаю ужасно длинное сообщение об ошибке.Это что-то вроде вызова неправильного родителя для CardLayout.

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

Если кто-то, кто-нибудь, может сказать мне, что происходит и как это исправить, это было бы оченьочень признателен.Если вам нужна дополнительная информация, я предоставлю ее!Спасибо!

1 Ответ

0 голосов
/ 01 декабря 2018

Это что-то вроде вызова неправильного родителя для CardLayout.

Для метода show(...) требуется панель, которая использует CardLayout, а не панель, на которую вы хотите переключиться.

Прочтите раздел из учебника Swing на Как использовать CardLayout для простого рабочего примера.

Также вы используете старый метод:

contentpane.add("Screen 1", screen1);

Выше используется метод add (String, Component).Прочитайте Container API.Этот метод устарел, вы должны использовать add(Component component, Object constraint) метод версии:

contentpane.add(screen1, "Screen 1");
...