Como inserir um Jbutton em um JPanel?

Ola Pessoal
Estou querendo criar uma interface para que toda a vez que eu clicar no Botão adiciona, ele adicione um Jbutton dentro de um Jtabel e alinhados na horizontal, sucessivamente
o código é este que tenho

public void inserirBotão() {

    cont++;
    JButton jt = new JButton();
    painelMesas.add(jt);
    jt.setSize(100, 50);
    jt.setForeground(Color.red);
    jt.setText("Mesa "+ cont);
    painelBotoes.revalidate();        
} 

só que assim eu consigo inserir um em cima do outro

O que eu devo fazer ?
Valeu

Do jeito que você está falando, você deverá utilizar Gerenciadores de Layout. Eles permitirão controlar a posição (e até tamanho) dos componentes na janela.

O mais simples e que permite a adição “lado a lado” é o FlowLayout.

painelMesas.setLayout(new FlowLayout());

Mais informações sobre o FlowLayout: http://download.oracle.com/javase/tutorial/uiswing/layout/flow.html

Há outros também - da API padrão do Java e também bibliotecas de terceiros. Vale a pena dar uma estudada no assunto: http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html

Tome cuidado com adição dinâmica de componentes no SWING. Não use indiscriminadamente…

[quote=diego_qmota]Do jeito que você está falando, você deverá utilizar Gerenciadores de Layout. Eles permitirão controlar a posição (e até tamanho) dos componentes na janela.

O mais simples e que permite a adição “lado a lado” é o FlowLayout.

painelMesas.setLayout(new FlowLayout());

Mais informações sobre o FlowLayout: http://download.oracle.com/javase/tutorial/uiswing/layout/flow.html

Há outros também - da API padrão do Java e também bibliotecas de terceiros. Vale a pena dar uma estudada no assunto: http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html

Tome cuidado com adição dinâmica de componentes no SWING. Não use indiscriminadamente… [/quote]

valeu ! deu certo mais tem outra duvida aqui como eu faço para ter um limite e ele começar inserindo na linha de baixo?

A orientação você configura no próprio componente que receberá o layout (http://download.oracle.com/javase/tutorial/uiswing/layout/flow.html):

FlowLayout experimentLayout = new FlowLayout();
compsToExperiment.setLayout(experimentLayout);
compsToExperiment.setComponentOrientation(
		ComponentOrientation.RIGHT_TO_LEFT);

Mas nem tudo são flores. Esse layout é bem simples e não permite controle da quantidade de componentes que são adicionados. Consulte a API: http://download.oracle.com/javase/6/docs/api/java/awt/FlowLayout.html
Mas isso pode ser facilmente contornado… :
[list]Crie uma classe que herda a classe que serve de container (suponho que seja o mais comum: JPanel);[/list]
[list]Inclua um contador que é incrementado todas as vezes que é adicionado um JButton (por exemplo);[/list]
[list]Sobrescreva o método add - de forma que ele impeça a adição de um componente, caso a contagem tenha sido alcançada.[/list]

Eu fiz mais ou menos o que você deve fazer. Estou sem tempo para testar. Teste aí e faça as modificações necessárias:

package teste.contadorjpanel;

import java.awt.Component;
import java.awt.LayoutManager;
import javax.swing.*;


public class JPanelComLimite extends JPanel {

    private int contadorComp;
    private final int limiteComp;

    public JPanelComLimite(int limiteComp) {
        super();
        initContadorComp();
        this.limiteComp = limiteComp;
    }

    public JPanelComLimite(boolean isDoubleBuffered, int limiteComp) {
        super(isDoubleBuffered);
        initContadorComp();
        this.limiteComp = limiteComp;
    }

    public JPanelComLimite(LayoutManager layout, int limiteComp) {
        super(layout);
        initContadorComp();
        this.limiteComp = limiteComp;
    }

    public JPanelComLimite(LayoutManager layout, boolean isDoubleBuffered, int limiteComp) {
        super(layout, isDoubleBuffered);
        initContadorComp();
        this.limiteComp = limiteComp;
    }

    private void initContadorComp() {
        contadorComp = 0;
    }




    @Override
    public Component add(Component comp) {

        if (contadorComp <= limiteComp) {
            contadorComp++;
            return super.add(comp);
        } else {
            return null;
        }

    }



}   //fim da classe

Tente usar esse JPanel (JPanelComLimite) para limitar os componentes. Se o método add retornar null, você dispara uma exceção indicando que o limite foi alcançado.

Olá diego_qmota,
Preciso de um favor seu veja se consegue me ajudar?
Eu estou com um projeto da faculdade de um sistema para um restaurante, e esse código que eu te pedi foi para fazer uma tela de controle de mesas. para adicionar e excluir botões que na verdade seria uma mesa em minha tela de controle de mesas.
teria como vc me ajudar a fazer esta tela?
Valeu…

Eu usaria um JList no lugar desses botões.

Usa o horizontal_wrap pros icones ficarem lado a lado como no windows explorer (é exatamente o que vc quer)

Cria uma variavel ImageIcon para ler a imagem

        
    ImageIcon icon = new ImageIcon("mesa.png")

    list = new JList();
        list.setFixedCellWidth(115); // largura do icone mesa
        list.setFixedCellHeight(95); // altura do icone mesa

        list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    list.setCellRenderer(new IconListRenderer(icon));
        

Dpois cria um cellRenderer customizado com a imagem das mesas


public class IconListRenderer

	extends DefaultListCellRenderer {

	private Icon icon = null;

	public IconListRenderer(Icon icon) 
              {
		this.icon = icon;
	}

	@Override
	public Component getListCellRendererComponent(
		JList list, Object value, int index,
		boolean isSelected, boolean cellHasFocus) {

		// Get the renderer component from parent class

		JLabel label =
			(JLabel) super.getListCellRendererComponent(list,
				value, index, isSelected, cellHasFocus);

        label.setVerticalTextPosition(JLabel.TOP);
        label.setHorizontalTextPosition(JLabel.CENTER); 

		label.setIcon(icon);

		return label;
	}

}

Thiago, você me desculpe, mas só posso ajudar passando orientações. Infelizmente eu não tenho tempo para trabalhar diretamente no código de outras pessoas… :slight_smile:
Como você quer representar objetos e seus estados (objeto mesa), a orientação do heroijapa é a mais indicada. Você provavelmente terá que fazer alguns acréscimos mas uma abordagem que consiga representar seus objetos e mudar conforme o estado deles mudam, é a mais indicada.
Estude o que foi passado pelo heroijapa, ajustando a orientação desses componentes, e para detectar e representar as mudanças de estado do objeto “Mesa”, eu recomendo que você aplique o pattern Observable (há um artigo sobre ele no GUJ http://www.guj.com.br/articles).

[quote=diego_qmota]Thiago, você me desculpe, mas só posso ajudar passando orientações. Infelizmente eu não tenho tempo para trabalhar diretamente no código de outras pessoas… :slight_smile:
Como você quer representar objetos e seus estados (objeto mesa), a orientação do heroijapa é a mais indicada. Você provavelmente terá que fazer alguns acréscimos mas uma abordagem que consiga representar seus objetos e mudar conforme o estado deles mudam, é a mais indicada.
Estude o que foi passado pelo heroijapa, ajustando a orientação desses componentes, e para detectar e representar as mudanças de estado do objeto “Mesa”, eu recomendo que você aplique o pattern Observable (há um artigo sobre ele no GUJ http://www.guj.com.br/articles).[/quote]

Ok eu intendo, mais valeu pelas dicas suas e do japa, me ajudaram bastante!!

É isso ai galera consegui inserir o Jlabel em um painel com este código abaixo.

        JLabel jt = new JLabel();
        painelMesas.add(jt);
        FlowLayout teste = new FlowLayout();
        painelMesas.setLayout(teste);
        painelMesas.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        painelMesas.setVerifyInputWhenFocusTarget(rootPaneCheckingEnabled);

Só que estou com outro probleminha hehehe…

É assim vou adicionando perfeitamente os Jlabel no Painel, só que quando chega no limite do Painel ele não pula para a proxima linha e continua inserindo na mesma linha, queria que pulasse para a proxima linha é simples mais sou iniciante e o troço, não vai!
ja tentei de tudo e nada!!!

Valew !!!