Witam proszę o wytłumaczenie lub link do materiałów które mogą mi rozjaśnić temat różnicy między dwoma kawałkami kodu.

Kod który nie działa i nie wyświetla tabeli w oknie:

public class OknoUsers extends JFrame {

    private JPanel contentPane;
    private JTable tabela;
    private JScrollPane scrollPanel;
    private TabModelUsers model;

    public OknoUsers() {
        setTitle("Baza użytkowników");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(300, 300, 800, 500);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

        model = new TabModelUsers();      // tworzę obiekt Model Tabeli, 
        tabela = new JTable();                     // tworzę obiekt JTable, 
        scrollPanel = new JScrollPane();    // tworzę obiekt JScrollPane, 

        tabela.setModel(model);                  // na obiekcie tabela (JTable) ustawiam swój model 
        scrollPanel.add(tabela);                   // dodaje do scrollPane JTable

        contentPane.add(scrollPanel);        //dodaje do contentPane scrollPane

        setContentPane(contentPane);
        setVisible(false);
    }

    public void pokazOkno() {
        setVisible(true);
    }

Kod który działa i poprawnie wyświetla tabele w oknie:


public class OknoUsers extends JFrame {

    private JPanel contentPane;
    private JTable tabela;
    private JScrollPane scrollPanel;
    private TabModelUsers model;

    public OknoUsers() {
        setTitle("Baza użytkowników");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(300, 300, 800, 500);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

        model = new TabModelUsers();
        tabela = new JTable(model);
        scrollPanel = new JScrollPane(tabela);

        contentPane.add(scrollPanel);

        setContentPane(contentPane);
        setVisible(false);
    }

    public void pokazOkno() {
        setVisible(true);
    }