Foro sobre Java SE > Problema con bucle for
No se puede hacer como lo planteas: esos números de las variables no son "índices".
Supongo que son componentes visuales, por el método setEnable.
Sería mejor que explicases con detalle el diseño que tienes.
Hola,
letra1 , ... , letra27 son las 27 letras del abecededario.
Más concretamente, son 27 botón que quiero están deshablitados y que quiero habilitar cuando se selecciona un JRadioButton.
La estructura basicamente es:
1- Inicializo y coloco en su sitio los 27 botones....
letra1=new JButton("A");
letra1.setBounds(270,200,30,30);
letra1.setMargin(new Insets(1,1,1,1));
letra1.setEnabled(false);
add(letra1);
letra1.addActionListener(this);
2. en public void actionPerformed(ActionEvent e) {
// quiero poner algo tipo
if(e.getSource()==nivel1 {letra1.setEnabled(true);letra2.setEnabled(true);letra3...27.setEnabled(true);}
Como me parece que esa manera de repetir las cosas es poco eficiente, quería plantearlo como un bucle.
Gracias y un saludo
Puedes añadir los botones en una List cuando los creas:
final List<JButton> botones = new ArrayList<>(27);
1- Inicializo y coloco en su sitio los 27 botones....
letra1=new JButton("A");
letra1.setBounds(270,200,30,30);
letra1.setMargin(new Insets(1,1,1,1));
letra1.setEnabled(false);
add(letra1);
letra1.addActionListener(this);
botones.add(letra1);
... así sucesivamente para todos los 27 botones.
con el método siguiente puedes ponerlos todos en enabled o disabled con facilidad.
public void setBotones(boolean isEnable){
for(JButton boton : botones){
boton.setEnable(isEnable);
}
}
Existe otra manera de "localizar" componentes en un contenedor.
En el test que sigue, se ve cómo hacerlo.
public class NewJFrame extends javax.swing.JFrame {
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
}
public static <T extends JComponent> List<T> getDescendantsOfType(Class<T> clazz, Container container, boolean nested) {
final Component[] components = container.getComponents();
final List<T> tList = new ArrayList<>(components.length);
for (Component component : components) {
if (clazz.isAssignableFrom(component.getClass())) {
tList.add(clazz.cast(component));
}
if (nested || !clazz.isAssignableFrom(component.getClass())) {
tList.addAll(SwingUtils.<T>getDescendantsOfType(clazz, (Container) component, nested));
}
}
return tList;
}
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
List<JButton> botones = getDescendantsOfType(JButton.class, jPanel1, false);
for (JButton boton : botones) {
System.out.println("boton " + boton.getText());
}
}
});
}
/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
jTextField1 = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.openide.awt.Mnemonics.setLocalizedText(jButton1, java.text.MessageFormat.format(java.util.ResourceBundle.getBundle("utils/Bundle").getString("NewJFrame.jButton1.text"), new Object[] {})); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton2, java.text.MessageFormat.format(java.util.ResourceBundle.getBundle("utils/Bundle").getString("NewJFrame.jButton2.text"), new Object[] {})); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton3, java.text.MessageFormat.format(java.util.ResourceBundle.getBundle("utils/Bundle").getString("NewJFrame.jButton3.text"), new Object[] {})); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton4, java.text.MessageFormat.format(java.util.ResourceBundle.getBundle("utils/Bundle").getString("NewJFrame.jButton4.text"), new Object[] {})); // NOI18N
jTextField1.setText(java.text.MessageFormat.format(java.util.ResourceBundle.getBundle("utils/Bundle").getString("NewJFrame.jTextField1.text"), new Object[] {})); // NOI18N
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton2)
.addComponent(jButton3)
.addComponent(jButton4))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(22, 22, 22)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(22, 22, 22)
.addComponent(jButton2)
.addGap(22, 22, 22)
.addComponent(jButton3)
.addGap(22, 22, 22)
.addComponent(jButton4)
.addContainerGap(18, Short.MAX_VALUE))
);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private static javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
}
Gracias por las respuestas. Voy a intentarlo.
"Hazlo o no lo hagas, pero no lo intentes"
Lo siento, pero evitarlo no he podido ;-)
Hola,
Resulta que tengo que hacer 27 veces lo siguiente:
letra1.setEnabled(false);
letra2.setEnabled(false);
letra3.setEnabled(false);
letra...27.setEnabled(false);
¿Se puede hacer con un bucle FOR? Algo tipo...
for (int i=0; i<27, i++) {letra[i].setEnabled(false);}
Gracias por la ayuda y un saludo.