Почему мой код не работает для CardLayout? Независимо от того, что я делаю, он просто показывает пустой JFrame

Что бы я ни делал, я не могу заставить JFrame что-либо показать. Это просто пусто. Я добавил кнопки starter и tutorialer в игру JPanel и добавил эту JPanel к картам JPanel, которые я установил в cardLayout.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class layouter extends JFrame {
    public static void main (String[]args){
        layouter x = new layouter();
    }
    public layouter(){
        setSize(600,600);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        Pan p = new Pan();
        setContentPane(p);
        setVisible(true);

    }
}

class Pan extends JPanel{
    JButton starter;
    JButton tutorialer;
    JPanel start;
    JPanel tutorial;
    JPanel game;
    JPanel cards;
   CardLayout cl;
        Pan(){  
        starter = new JButton("start");
        tutorialer = new JButton("tutorial");
        start = new JPanel();
        tutorial = new JPanel();
        game = new JPanel();
        cards = new JPanel( new CardLayout());
        cl= (CardLayout)(cards.getLayout());
        game.setLayout(null);
        starter.setBounds(150,150,100,50);
        tutorialer.setBounds(150,200,100,50);
         game.add(starter);
        game.add(tutorialer);
        cards.add(game,"game");
        add(cards);
    repaint();
  }

public void paintComponent(Graphics g){
    super.paintComponent(g);
    cl.show(cards,"game");
    System.out.println("hello");
}

}


person SocketPhys    schedule 24.04.2015    source источник
comment
Это cl.show(cards,"game"); является плохой идеей в методе paintComponent, и вы НИКОГДА не должны изменять состояние любого компонента из любого метода рисования.   -  person MadProgrammer    schedule 24.04.2015
comment
Спасибо! Кажется, это работает! Но почему Null Layout не работает. Я использовал .setBounds, верно?   -  person SocketPhys    schedule 24.04.2015
comment
Менеджеры макетов делают больше, чем просто компоненты макета, они предоставляют родительским контейнерам информацию о количестве места, которое требуется самому контейнеру (на основе его содержимого).   -  person MadProgrammer    schedule 24.04.2015


Ответы (1)


game.setLayout(null); ‹-- Это вызовет у вас проблемы, поскольку все, что вы добавляете в этот контейнер, больше не будет размещаться автоматически. Компоненты по умолчанию имеют размер и позицию 0x0.

Используйте соответствующий менеджер компоновки. Дополнительные сведения см. в разделе Размещение компонентов внутри контейнера.

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

cl.show(cards, "game");
person MadProgrammer    schedule 24.04.2015