Foro sobre Java SE > Gráficos con Netbeans - Conjunto de botones
He visto por ahí que quizas sea posible con un jTable con 50 celdas y que en cada una se muestre el icono correspondiente y capture el clic del ratón para ir cambiando de icono a mostrar, pero no tengo ni idea de como hacer esto. Alguna orientación, por favor?
Una posible solución, según lo que planteas:
public class NewJFrame extends javax.swing.JFrame {
private javax.swing.JPanel jPanel1;
/** Creates new form NewJFrame */
public NewJFrame() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1 = new javax.swing.JPanel();
jPanel1.setPreferredSize(new Dimension(450, 450));
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Patio de Butacas")); // NOI18N
getContentPane().add(jPanel1);
jPanel1.setLayout(new java.awt.GridLayout(7, 4, 7, 4));
for (int i = 0; i < 50; i++) {
JButton jButton = new javax.swing.JButton();
jButton.setPreferredSize(new Dimension(50, 50));
jButton.setName("jButton" + i);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jButton.setBackground(Color.red);
}
});
jPanel1.add(jButton);
}
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}
}
Como puedes ver, los botones se añaden a un JPanel, por lo que puedes crear una clase que extienda JPanel, por ejemplo:
public class PatioDeButacas extends JPanel
y añadirle el código de los botones. Esa clase la puedes añadir a tu diseño de aplicación con el Matisse de NetBeans.
Mil gracias!!! Es estupendo!!! Ya sólo tengo que colocar los botones en el sitio exacto y en vez de cambiar de color, que cambie de icono!!!
Con GridLayout no vas a poder colocarlos a medida. Tal vez necesites usar GridBagLayout.
http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
Si ves que va a ser muy complicado crear ese layout, también puedes asignarle el mismo método a cada botón, en el Matisse, en vez de crear uno diferente de cada vez.
public class NewJFrame extends javax.swing.JFrame implements ActionListener {
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
}
/** 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() {
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(NewJFrame.class, "NewJFrame.jButton1.text")); // NOI18N
jButton1.addActionListener(this);
org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(NewJFrame.class, "NewJFrame.jButton2.text")); // NOI18N
jButton2.addActionListener(this);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton2)
.addContainerGap(228, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jButton2))
.addContainerGap(266, Short.MAX_VALUE))
);
pack();
}
// Code for dispatching events from components to event handlers.
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == jButton2) {
NewJFrame.this.ButtonActions(evt);
}
else if (evt.getSource() == jButton1) {
NewJFrame.this.ButtonActions(evt);
}
}// </editor-fold>
private void ButtonActions(java.awt.event.ActionEvent evt) {
// cambiar el icono del botón
}
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
// End of variables declaration
}
Saludos (: ... Como seria Cuando Doy el primer click en uno de los botones cambie el color o el icono Pero al Dar el Segundo Click Vuelva a su estado Normal (Inicial )!!Como manejaría ese evento ya que uso 100 botones y aparte tengo que controlar la cantidadd de botones seleccionados ..Ejemplo : Compro 5 entradas por ende solo tengo que clickear 5 botones pero no 6 ni mass... Gracias !!!
Hola buenas tardes, estoy haciendo un programa con gráficos en Netbeans y me he quedado atascada.
Una parte de mi programa debe gestionar una sala de butacas (en plan cine, ocupadas, reservadas, seleccionadas y libres) y que el usuario pueda interactuar con las butacas, seleccionando o deseleccionando las butacas que quiera comprar. Bueno pues como tengo 50 butacas, se me había ocurrido ponerlas gráficamente representadas con botones, que sería lo mas fácil, pero claro, para capturar cada evento de cada butaca tendría que tener las 50 variables y 50 métodos que controlen el clic del ratón de los 50 botones y me parece un atraso tener tantos métodos cuando deben hacer exactamente lo mismo (Cambiar el color según el estado de la butaca y registrar su estado en una tabla).
No habría alguna manera de generar estos botones con un for, ubicarlos en el sitio exacto de la pantalla en el que quiero que estén y manejar los eventos desde un arraylist o algo parecido?
Si no se puede hacer con botones pues con otro elemento, el caso es mostrar los iconos de butacas que van cambiando de color (es decir cambia el icono a mostrar) si se hace clic encima de el. Si no me he explicado bien, piensen en las aplicaciones de compra de entradas de los cines cuando tienes que elegir los asientos.
Por favor, sólo necesito que me den alguna idea por donde pueda seguir.Gracias