Estou tentando implementar uma função que selecione todas as imagens que o laço for gera e faça alguma função com elas (ex: setar a borda, deixar desativado), porém quando executo minha aplicação ela seleciona apenas os últimos botões com imagens, mas não os primeiros. Peço desculpas pelo código um tanto quanto primário pois sou novo nesta área, apesar da idade da linguagem.
Segue o cod.
importjava.awt.BorderLayout;importjava.awt.Component;importjava.awt.FlowLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JFrame;import staticjavax.swing.JFrame.EXIT_ON_CLOSE;importjavax.swing.JPanel;publicclassSelecionarextendsJFrame{privateJPaneljpanel;privateJButtonbtnselecionar;privateJPaneljpanelFixo;publicSelecionar(){super("Selecionando Imagens");setDefaultCloseOperation(EXIT_ON_CLOSE);//setLayout(null); setSize(800,600);/*********************************************/intqtdLoop=2;jpanelFixo=newJPanel();for(intx=0;x<qtdLoop;x++){//2 GIROSjpanel=newJPanel(newFlowLayout(FlowLayout.LEFT,11,20));btnselecionar=newJButton("Marcar");for(inti=0;i<3;i++){jpanel.add(newJButton(newImageIcon("img/iconecadastro2.png")));}jpanelFixo.add(btnselecionar,BorderLayout.SOUTH);jpanelFixo.add(jpanel);}//FIM DO LAÇOadd(jpanelFixo,BorderLayout.CENTER);btnselecionar.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){Componentcomponentes[]=jpanel.getComponents();for(Componentc:componentes){if(cinstanceofJButton){if(((JButton)c).isEnabled()==true){((JButton)c).setEnabled(false);}else{((JButton)c).setEnabled(true);}}}}});}publicstaticvoidmain(String[]args){newSelecionar().setVisible(true);}}
A função setEnabled marcou meus 2 botões com evento para false porém não os botões do jpanel. Vê se pode isso! Vlw pela dica.
S
staroski
É que agora você só está pegando os botões do jpanelFixo e não do jpanel.
Antes tu só pegava do jpanel e não pegava do jpanelFixo.
Você precisa pegar os botões de ambos.
D
Dinelli
Desculpe minha burrice, mas como eu pegaria esses jbuttons e mudaria o status deles estando dentro de outro jpanel criado no meu laço, seria com o instanceof?
if (c instanceof JButton)
Vlw pelas dicas
S
staroski1 like
Fazendo exatamente a mesma coisa, só que para os dois JPanels, não apenas um deles.
Você tem que desabilitar os botões do jpanel e os botões do jpanelFixo.
No seu laço abaixo, na segunda passada, você está matando as variáveis que criou na primeira passada:
for (int x = 0; x < qtdLoop; x++) {// 2 GIROS
D
Dinelli
Na realidade eu iria utilizar esse laço para mostrar varios jpanels (separados por data) vindo de uma consulta sql. Teria alguma outra forma de realizar este procedimento de forma pratica sem ter que aumentar o numero de linhas copiadas e coladas (por ex: se eu copiar e colar varios jpanels manualmente em visible(false))?
Vlw pelas dicas
D
Dinelli
Consegui fazer o que eu queria de uma outra forma, porém não sinto que meu código esta pratico, da maneira encontrada tem muitos if implementados no ActionListener, tens alguma idéia? Lembrando que precisa ser dinâmico pois terei de implementar vários painéis como este:
private JPanel jpanel[] = new JPanel[2];
vindo de um arraylist ex:
private List resultadoConsultaSql = new ArrayList(); private JPanel jpanel[] = new JPanel[resultadoConsultaSql.size()];
Segue meu código:
importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JToggleButton;publicclassSelecionarextendsJFrame{privateJPaneljpanel[]=newJPanel[2];privateJButtonjbutton[][]=newJButton[jpanel.length][3];privateJToggleButtonbtnselecionar[]=newJToggleButton[jpanel.length];privateJPaneljpanelFixo;publicSelecionar(){super("Selecionando Imagens");setDefaultCloseOperation(EXIT_ON_CLOSE);//setLayout(null); setSize(800,600);ActionListenerlistener=newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){if(e.getSource()instanceofJToggleButton){Stringtext=((JToggleButton)e.getSource()).getActionCommand();JToggleButtonjb=((JToggleButton)e.getSource());//JOptionPane.showMessageDialog(null, text);intvalor=Integer.parseInt(text);if(valor==0){intmax=1;for(inti=0;i<max;i++){for(intj=0;j<3;j++){if(jb.isSelected()==true){jbutton[i][j].setEnabled(false);}else{jbutton[i][j].setEnabled(true);}}}}if(valor==1){intmax=2;for(inti=valor;i<max;i++){for(intj=0;j<3;j++){if(jb.isSelected()==true){jbutton[i][j].setEnabled(false);}else{jbutton[i][j].setEnabled(true);}}}}}}};jpanelFixo=newJPanel();for(intx=0;x<jpanel.length;x++){jpanel[x]=newJPanel(newFlowLayout(FlowLayout.LEFT,11,20));btnselecionar[x]=newJToggleButton();//selectall_icon.pngbtnselecionar[x].setIcon(newjavax.swing.ImageIcon(getClass().getResource("/img/selectall_icon.png")));btnselecionar[x].setActionCommand(String.valueOf(x));btnselecionar[x].addActionListener(listener);for(inti=0;i<3;i++){jbutton[x][i]=newJButton();jbutton[x][i].setIcon(newjavax.swing.ImageIcon(getClass().getResource("/img/java.png")));jpanel[x].add(jbutton[x][i]);//jpanel.add(new JButton(new ImageIcon("img/java.png")));}jpanelFixo.add(jpanel[x]);jpanelFixo.add(btnselecionar[x],BorderLayout.SOUTH);}//FIM DO LAÇOadd(jpanelFixo,BorderLayout.CENTER);}publicstaticvoidmain(String[]args){newSelecionar().setVisible(true);}}
Realmente não está prático.
Programação orientada à objetos preza pela reutilização.
Criar uma classe que estenda JPanel e tenha o botão selecionar e as 3 imagens.
Aí é só você instanciar e adicionar objetos dessa nova classe ao invés de repetir o mesmo código diversas vezes.