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… 
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… 
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 !!!