[Resolvido] Botões não aparecem no JPanel, mas estão lá

4 respostas
D
package campoMinado.interfaceCampo;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import javax.swing.JPanel;

import campoMinado.handler.HandlerCampo;

public class Projeto{
	private static JFrame frame;
	private static final long serialVersionUID = 1L;
	private static JButtonEditado[][] buttonEditados = new JButtonEditado[10][10];
	private static JPanel jPanel;
	private JMenu menu, menu2;
	private static JMenuItem menuItem,menuItem2,menuItem3;
	private HandlerCampo handlerCampo = new HandlerCampo();
	private int a = 0;
	//Construtor da classe
	public Projeto() {
		initComponent();
	}
	//Método construtor da classe
	public void initComponent(){
		frame = new JFrame("Campo Minado");
		frame.setLayout(new BorderLayout());
		jPanel = montaCampo();
		frame.add(jPanel, BorderLayout.CENTER);
		frame.setJMenuBar(montaMenu());
		// Adição dos ActionListeners
		for (int l = 0; l < 10 ; l++)
			for(int c = 0; c < 10; c++)
				buttonEditados[l][c].addActionListener(handlerCampo);
		menuItem.addActionListener(handlerCampo);
		menuItem2.addActionListener(handlerCampo);
		menuItem3.addActionListener(handlerCampo);
		frame.setVisible(true);
		frame.setSize(350,350);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public JPanel montaCampo() {
		JPanel panel = new JPanel(new GridLayout(10,10));
		for (int l = 0; l < 10; l++)
			for(int c = 0; c < 10; c++){
			buttonEditados[l][c] = new JButtonEditado("Oi"+(a++));
			}
		for(int l = 0; l < 10; l++)
			for(int c = 0; c < 10; c++){
				buttonEditados[l][c].setActionCommand("Botão"+(a++));		
				}
		for (int l = 0; l < 10; l++)
			for(int c = 0; c < 10; c++){
			panel.add(buttonEditados[l][c]);
			}
		return panel;
	}

	public JMenuBar montaMenu() {
		JMenuBar menuBar = new JMenuBar();
		menu = new JMenu("Opções");
		menu2 = new JMenu("Niveis");
		menu2.add(menuItem = new JMenuItem("Fácil"));
		menu2.add(menuItem2 = new JMenuItem("Médio"));
		menu2.add(menuItem3 = new JMenuItem("Difícil"));
		menu.add(menu2);
		menuBar.add(menu);
		return menuBar;
	}
	/*Método criado para a atualizacao dos botoes, quando é escolhido a dificuldade do jogo.
	 * 
	 */
	public static void atualizaCampo(int colunaMODE, int linhaMODE) {
		jPanel.removeAll();
		jPanel.setLayout(new GridLayout(colunaMODE,linhaMODE));
		for (int l = 0; l < linhaMODE ; l++)
			for(int c = 0; c < colunaMODE; c++)
			jPanel.add(buttonEditados[l][c]);
		frame.repaint();
		frame.validate();
	}

	public static JButtonEditado[][] getButtons() {
		return buttonEditados;
	}
	public static JMenuItem getMenuItem() {
		return menuItem;
	}
	public static JMenuItem getMenuItem2() {
		return menuItem2;
	}
	public static JMenuItem getMenuItem3() {
		return menuItem3;
	}

}

Acredito que o erro esteja no método montaMenu();
O JPanel exibe somente um botão, mas se percorro o jpanel com o mouse esse único botão se transforma no botão que deveria estar aparecendo no jpanel.

4 Respostas

M

Diego

tente algo como isso no construtor

setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		initialize();
		this.pack();

Não ponha os metodos de seu Jframe principal antes da criação de novos componentes.

//Seu código blábláblá...
 frame.setVisible(true);  
        frame.setSize(350,350);  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
D

Há alguns desenvolvedores java que abominam o netbeans.
Porém, foi com ele que eu aprendi que, variáveis locais podem fazer elementos swing desaparecem.

D

Mateus tentei mas não mudou nada. E neste caso o uso do pack() não é a melhor opção.

drsmachado, o que você quis dizer com variáveis locais?

D

Obrigados a todos, mas já resolvi o erro.

Ele não estava na GUI e sim em uma classe que eu tinha criado

package GUI;

import javax.swing.Icon;
import javax.swing.JButton;
/*
 * Classe criada para a simulacao de um botao como uma bomba do campo minado
 * @bombasAdjacentes = quantidades de bombas ao redor deste botao
 * @X = posicao do botao no eixo X
 * @Y = posicao do botao no eixo Y
 */
public class JButtonEditado extends JButton {
	private static final long serialVersionUID = 1L;
	private boolean bomb;
	private int bombasAdjacentes,X,Y;

	public JButtonEditado(){
		super();
	}
	public JButtonEditado(String string, Icon icone) {
		super(string, icone);
	}

	public JButtonEditado(String string) {
		super(string);
	}

	public void setBombasAdjacentes(int b) {
		this.bombasAdjacentes = b;
	}

	public int getBombasAdjacentes() {
		return bombasAdjacentes;
	}

	public void setBomb(boolean b) {
		this.bomb = b;
	}

	public boolean isBomb() {
		return bomb;
	}

	public int getPosicaoX() {
		return X;
	}

	public void setPosicaoX(int x) {
		X = x;
	}

	public int getPosicaoY() {
		return Y;
	}

	public void setPosicaoY(int y) {
		Y = y;
	}
}
Estes ultimos 4 métodos estavam assim
public int getX() {
		return X;
	}

	public void setX(int x) {
		X = x;
	}

	public int getY() {
		return Y;
	}

	public void setY(int y) {
		Y = y;
	}
}

Sem perceber, sobrescrevi os métodos da classe JButton, e isto fez com que eles não conseguissem ser dispostos um ao lado do outro.

Criado 26 de setembro de 2011
Ultima resposta 27 de set. de 2011
Respostas 4
Participantes 3