Ajuda com botão usando Action Listener e Action Performed

Bom dia, preciso de ajuda para implementar a main par que apareça um botão utilizando Action Listener e Action Performed, preciso que apareça algo parecido com isso:

Capturar

Meu código

package exemploswing2;
import javax.swing.;
import java.awt.
;
import java.awt.event.*;

public class ExemploSwing2 extends JFrame implements ActionListener {

private static String prefixoDoLabel = "Número de cliques: ";
private int numClicks = 0;
final JLabel label = new JLabel (prefixoDoLabel + "0 ");

public Component criaComponentes (){
    JFrame frame = new JFrame ("Outro exemplo de swing!");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    
    JButton button = new JButton ("Clique aqui!");
    button.addActionListener (this);
    label.setLabelFor(button);
    JPanel pane = new JPanel (new GridLayout (0, 1));
    pane.add (button);
    pane.add (label);
    
    return pane;
}

@Override
public void actionPerformed (ActionEvent e){
    numClicks++;
    label.setText (prefixoDoLabel + numClicks);
}


public static void main(String[] args) {

    }

}

//Dentro do main
ExemploSwing2 frame = new ExemploSwing2();
frame.criaComponentes();

Porém, isso pode criar uma janela “invisível” (por não haver a definição de tamanho).

E foi o que aconteceu, como posso resolver isso?

Antes de falar como resolver, eu só percebi agora, estas linhas:

Elas são desnecessárias, você pode trocá-las por isso

setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setVisible(true);

Pois estamos falando de uma classe que estende JFrame, logo, herda todos os seus métodos e atributos (não privados).

Sobre a questão, a classe Component, da qual JFrame é uma subclasse, possui o método sobrecarregado setBounds que, basicamente, funciona a partir da definição da posição do ponto 0 (referente à tela, no canto superior esquerdo do JFrame/Component em questão) e suas medidas (comprimento e altura.
O interessante é que a nossa referência, quando falamos em pontos cartesianos (lembre-se teu monitor é um grande gráfico cartesiano, com pontos no eixo X (horizontal) e Y (vertical)) se baseia no ponto (0, 0) começando no canto inferior esquerdo. Porém, o java funciona de maneira diferente, o ponto (0, 0), para ele, é no canto superior esquerdo. E, sim, faz sentido, você não constrói janelas pensando no ponto inferior esquerdo, mas, no superior esquerdo.

Para teu problema, sugiro que comece colocando o setBounds dentro do método criaComponentes, antes do setVisible(true)

setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 300, 250);//100 do ponto 0, 100 do ponto 0, 300 de largura, 250 de altura
setVisible(true);

Ah, outra coisa, teoricamente, as medidas informadas no setBounds deveriam ser em pixels, mas, por alguma razão, o java não tem uma proporção 1/1 com os pixels, logo, não é certeza que 300 px no java sejam 300 px reais.

@darlan_machado, muito obrigado pela explicação, irei testar aqui.

Como faço para implementá-lo na main?

Implementar o que na main?