Porque o JButton ocupa o JFrame inteiro e como conserto?

Tenho uma classe que cria um JFrame a partir do acionamento de um botão. Dentro deste JFrame novo tem um botão que eu dimensionei para 75, 30 mas toda vez que aciono o botão que abre o JFrame o novo botão ocupa ele inteiro e eu não sei porque. Alguém pode me ajudar?

Este código abaixo é o que chama a classe que cria o novo JFrame:

        btCadForProduto.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadForProdutoMP jFrame2 = new GuiCadForProdutoMP(produtos.produto);
                jFrame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                jFrame2.setVisible(true);
            }
        });

E este código abaixo é a classe que cria o JFrame:

package view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import model.Fornecedores;
import model.ProdutosMP;
import moduloIndustrial.GuiMenuPrincipal;
import moduloIndustrial.Util;

/**
 *
 * @author Ronaldo Rodrigues Godoi
 */
public class GuiCadForProdutoMP extends JFrame {
    
    ProdutosMP produtoMP;
    public ArrayList<Fornecedores> listaFornecedores = new ArrayList<>();
    Util util = new Util();
    Date nova_data = new Date();
    DateFormat formatoData = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    JLabel lbAssossiacaoFornecedor, lbid_produto, lbid_fornecedor,
            lbProduto, lbFornecedor, lbPreco, lbData_compra, lbData_cadastro,
            lbTabelaFornecedorProdutoMP;
    JTextField tfId_produto, tfId_fornecedor, tfPreco, tfData_compra, tfData_cadastro;
    JButton btNovo, btLocalizar, btSalvar, btAlterar, btExcluir, btCancelar, btSair;
    JTable tabelaFornecedorProdutoMP;
        
    public GuiCadForProdutoMP(ProdutosMP produtoMP) {
        
        this.produtoMP = produtoMP;
        inicializarComponentes();
        definirEventos();
    }
    
    public void inicializarComponentes() {
        
        setBounds(0, 0, 1000, 800);
        
        btSair = new JButton(null, new ImageIcon("/imagens/sair.png"));
        btSair.setToolTipText("Sair");
        btSair.setBounds(850, 700, 75, 30);
        add(btSair);
                
        
    }
    
    public void definirEventos() {
        
        btSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiMenuPrincipal.liberaMenu();
                dispose();
            }
        });
        
    }
    
}

Não repare no sentido geral da classe, ela é um esboço e estou fazendo por partes. Porque meu botão ocupa o JFrame inteiro? Como Concerto para que ele tenha as medidas do seu setBounds?

Obrigado,
Ronaldo

Não adianta usar setBounds se você não remover o gerenciador de layout padrão. Para JFrames o gerenciador padrão é o BorderLayout. Ao adicionar um componente sem especificar a área de inserção, ele será inserido em BorderLayout.CENTER, por isso ele ocupa o frame inteiro. A única desculpa para não usar gerenciadores de layout é se sua GUI for absurdamente complicada E vc precisar realmente posicionar seus componentes de forma absoluta, caso contrário, o ideal é usar algum gerenciador. Enfim, para resolver seu “problema”, insira setLayout( null ); como primeira instrução do seu método inicializarComponentes() (antes de setBounds(0, 0, 1000, 800);).

Percebo que a maioria das suas questões aqui no GUJ tem algo a ver com GUI. Pq vc não estuda em algum livro bom? Esse tipo de dúvidas do layout é algo beeeeeemmmm de iniciante em Swing. Pega o Java Como Programar, a última edição traduzida, e estuda os capítulos de interface gráfica.

5 curtidas