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);
	}