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.
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;
public class Selecionar extends JFrame {
private JPanel jpanel;
private JButton btnselecionar;
private JPanel jpanelFixo;
public Selecionar() {
super("Selecionando Imagens");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//setLayout(null);
setSize(800, 600);
/*********************************************/
int qtdLoop = 2;
jpanelFixo = new JPanel();
for (int x=0;x<qtdLoop;x++){//2 GIROS
jpanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 11,20));
btnselecionar = new JButton("Marcar");
for (int i = 0; i < 3; i++) {
jpanel.add(new JButton(new ImageIcon("img/iconecadastro2.png")));
}
jpanelFixo.add(btnselecionar, BorderLayout.SOUTH);
jpanelFixo.add(jpanel);
}//FIM DO LAÇO
add(jpanelFixo, BorderLayout.CENTER);
btnselecionar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Component componentes[] = jpanel.getComponents();
for (Component c : componentes) {
if (c instanceof JButton) {
if(((JButton) c).isEnabled() == true){
((JButton) c).setEnabled(false);
}else{
((JButton) c).setEnabled(true);
}
}
}
}
});
}
public static void main(String[] args) {
new Selecionar().setVisible(true);
}
}
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?
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.
public void actionPerformed(ActionEvent e) {
trocaEstadoBotoes(jpanel);
trocaEstadoBotoes(jpanelFixo);
}
private void trocaEstadoBotoes(JPanel container) {
Component componentes[] = container.getComponents();
for (Component c : componentes) {
if (c instanceof JButton) {
JButton botao = (JButton) c;
botao.setEnabled(!botao.isEnabled());
}
}
}
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))?
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:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
public class Selecionar extends JFrame{
private JPanel jpanel[] = new JPanel[2];
private JButton jbutton[][] = new JButton[jpanel.length][3];
private JToggleButton btnselecionar[] = new JToggleButton[jpanel.length];
private JPanel jpanelFixo;
public Selecionar() {
super("Selecionando Imagens");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//setLayout(null);
setSize(800, 600);
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JToggleButton) {
String text = ((JToggleButton) e.getSource()).getActionCommand();
JToggleButton jb = ((JToggleButton) e.getSource());
//JOptionPane.showMessageDialog(null, text);
int valor = Integer.parseInt(text);
if(valor == 0){
int max = 1;
for (int i = 0; i < max; i++) {
for(int j = 0; j < 3; j++) {
if(jb.isSelected() == true ){
jbutton[i][j].setEnabled(false);
}else{
jbutton[i][j].setEnabled(true);
}
}
}
}
if(valor == 1){
int max = 2;
for (int i = valor; i < max; i++) {
for(int j = 0; j < 3; j++) {
if(jb.isSelected() == true ){
jbutton[i][j].setEnabled(false);
}else{
jbutton[i][j].setEnabled(true);
}
}
}
}
}
}
};
jpanelFixo = new JPanel();
for (int x=0;x<jpanel.length;x++) {
jpanel[x] = new JPanel(new FlowLayout(FlowLayout.LEFT, 11,20));
btnselecionar[x] = new JToggleButton();//selectall_icon.png
btnselecionar[x].setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/selectall_icon.png")));
btnselecionar[x].setActionCommand(String.valueOf(x));
btnselecionar[x].addActionListener(listener);
for (int i = 0; i < 3; i++) {
jbutton[x][i] = new JButton();
jbutton[x][i].setIcon(new javax.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ÇO
add(jpanelFixo, BorderLayout.CENTER);
}
public static void main(String[] args) {
new Selecionar().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.