import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.border.*; /** * Ventana (JFrame) principal del programa. * @author Carlos Cortes */ public class Frame extends JFrame { private Panel cuboPanel; private JPanel detallePanel; private ArrayList detIconList; /** */ public Frame() { setTitle("Rubik"); setSize(800, 600); /* creando Panel Base */ JPanel basePanel = new JPanel(); basePanel.setMinimumSize(new Dimension(620, 460)); basePanel.setPreferredSize(new Dimension(1000, 700)); BoxLayout baseLayout = new BoxLayout(basePanel, BoxLayout.Y_AXIS); basePanel.setLayout(baseLayout); /* creando panel de etapas */ JPanel etapasPanel = new JPanel(); etapasPanel.setMinimumSize(new Dimension(620, 92)); etapasPanel.setPreferredSize(new Dimension(1000, 92)); etapasPanel.setMaximumSize(new Dimension(1024, 92)); TitledBorder title = BorderFactory.createTitledBorder (BorderFactory.createLineBorder(Color.black), "Etapas"); title.setTitleJustification(TitledBorder.LEFT); etapasPanel.setBorder(title); basePanel.add(etapasPanel); /* creando panel para Detalle y Cubo */ JPanel infPanel = new JPanel(); //infPanel.setAlignmentX(0f); infPanel.setMinimumSize(new Dimension(620, 300)); infPanel.setPreferredSize(new Dimension(620, 480)); BoxLayout infLayout = new BoxLayout(infPanel, BoxLayout.X_AXIS); infPanel.setLayout(infLayout); basePanel.add(infPanel); /* creando panel para Detalle */ detallePanel = new JPanel(); detallePanel.setMinimumSize(new Dimension(220, 300)); detallePanel.setPreferredSize(new Dimension(290, 480)); //detallePanel.setMaximumSize(new Dimension(300, 800)); TitledBorder title2 = BorderFactory.createTitledBorder (BorderFactory.createLineBorder(Color.black), "Detalle"); title.setTitleJustification(TitledBorder.LEFT); detallePanel.setBorder(title2); //BoxLayout detLayout = new BoxLayout(basePanel, BoxLayout.Y_AXIS); //etapasPanel.setLayout(detLayout); infPanel.add(detallePanel); /* creando panel del cubo rubik */ cuboPanel = new Panel(); cuboPanel.setMinimumSize(new Dimension(400, 300)); cuboPanel.setPreferredSize(new Dimension(750, 480)); cuboPanel.setMaximumSize(new Dimension(1024, 768)); cuboPanel.setBorder(BorderFactory.createLoweredBevelBorder()); //agregando botones ButtonHandler taskPerformer = new ButtonHandler(); ImageIcon nuevoButtonIcon = createImageIcon("images/nuevo.gif"); JButton bNuevo = new JButton(nuevoButtonIcon); bNuevo.setToolTipText("Nuevo"); bNuevo.setActionCommand("nuevo"); cuboPanel.add(bNuevo); bNuevo.addActionListener(taskPerformer); ImageIcon mezclarButtonIcon = createImageIcon("images/mezclar.gif"); JButton bMezclar = new JButton(mezclarButtonIcon); bMezclar.setToolTipText("Mezclar"); bMezclar.setActionCommand("mezclar"); cuboPanel.add(bMezclar); bMezclar.addActionListener(taskPerformer); ImageIcon giroXButtonIcon = createImageIcon("images/giroX.gif"); JButton bGiroX = new JButton(giroXButtonIcon); bGiroX.setToolTipText("giro sobre X"); bGiroX.setActionCommand("giroX"); cuboPanel.add(bGiroX); bGiroX.addActionListener(taskPerformer); ImageIcon giroYButtonIcon = createImageIcon("images/giroY.gif"); JButton bGiroY = new JButton(giroYButtonIcon); bGiroY.setToolTipText("giro sobre Y"); bGiroY.setActionCommand("giroY"); cuboPanel.add(bGiroY); bGiroY.addActionListener(taskPerformer); ImageIcon giroZButtonIcon = createImageIcon("images/giroZ.gif"); JButton bGiroZ = new JButton(giroZButtonIcon); bGiroZ.setToolTipText("giro sobre Z"); bGiroZ.setActionCommand("giroZ"); cuboPanel.add(bGiroZ); bGiroZ.addActionListener(taskPerformer); infPanel.add(cuboPanel); /* llenando etapaPanel */ ImageIcon et1 = createImageIcon("images/etapa1.gif"); ImageIcon et2 = createImageIcon("images/etapa2.gif"); ImageIcon et3 = createImageIcon("images/etapa3.gif"); ImageIcon et4 = createImageIcon("images/etapa4.gif"); ImageIcon et5 = createImageIcon("images/etapa5.gif"); ImageIcon et6 = createImageIcon("images/etapa6.gif"); ImageIcon et7 = createImageIcon("images/etapa7.gif"); JButton bE1 = new JButton(et1); JButton bE2 = new JButton(et2); JButton bE3 = new JButton(et3); JButton bE4 = new JButton(et4); JButton bE5 = new JButton(et5); JButton bE6 = new JButton(et6); JButton bE7 = new JButton(et7); bE1.setActionCommand("det1"); bE2.setActionCommand("det2"); bE3.setActionCommand("det3"); bE4.setActionCommand("det4"); bE5.setActionCommand("det5"); bE6.setActionCommand("det6"); bE7.setActionCommand("det7"); bE1.addActionListener(taskPerformer); bE2.addActionListener(taskPerformer); bE3.addActionListener(taskPerformer); bE4.addActionListener(taskPerformer); bE5.addActionListener(taskPerformer); bE6.addActionListener(taskPerformer); bE7.addActionListener(taskPerformer); GridLayout etLayout = new GridLayout(1, 7, 4, 4); etapasPanel.setLayout(etLayout); etapasPanel.add(bE1); etapasPanel.add(bE2); etapasPanel.add(bE3); etapasPanel.add(bE4); etapasPanel.add(bE5); etapasPanel.add(bE6); etapasPanel.add(bE7); detIconList = new ArrayList(); detIconList.add(createImageIcon("images/det1.gif")); detIconList.add(createImageIcon("images/det2.gif")); detIconList.add(createImageIcon("images/det3.gif")); detIconList.add(createImageIcon("images/det4.gif")); detIconList.add(createImageIcon("images/det5.gif")); detIconList.add(createImageIcon("images/det6.gif")); detIconList.add(createImageIcon("images/det7.gif")); /* agregando todos los Panel al frame */ Container contentPane = getContentPane(); contentPane.add(basePanel); } /** * Clase encargada de llamar las acciones que deben hacer los botones. */ private class ButtonHandler implements ActionListener { public ButtonHandler() {}; public void actionPerformed(ActionEvent e) { String comando = e.getActionCommand(); int count; if (comando.equals("nuevo")) { cuboPanel.nuevoCubo(); cuboPanel.repaint(); } else if (comando.equals("mezclar")) { cuboPanel.mezclarCubo(); cuboPanel.repaint(); } else if (comando.equals("giroX")) { cuboPanel.giroAnimado("X "); cuboPanel.repaint(); } else if (comando.equals("giroY")) { cuboPanel.giroAnimado("Y "); cuboPanel.repaint(); } else if (comando.equals("giroZ")) { cuboPanel.giroAnimado("Z "); cuboPanel.repaint(); } else if (comando.equals("det1")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 1: Debe formar una cruz con sus cuatro\n" + "extremos posicionados correctamente.\n" + "Es bastante facil.\n" + "Los patrones mostrados pueden ayudarle.")); detallePanel.add(new JLabel(detIconList.get(0))); detallePanel.validate(); } else if (comando.equals("det2")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 2: Ahora hay que poner los 4\n" + "vertices en su lugar. Elija uno,\n" + "encuentrelo y trate de ponerlo justo\n" + "en la esquina de abajo de donde\n" + "deberia ir. Ahora solo tiene que seguir\n" + "la secuencia de movimientos que\n" + "corresponda al caso resultante.\n")); detallePanel.add(new JLabel(detIconList.get(1))); detallePanel.validate(); } else if (comando.equals("det3")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 3: Gire la capa A hasta encontrar\n" + "el caso A o el caso B, si esto no sirvio,\n" + "la pieza que necesita ya esta en la capa\n" + "del medio, puede sacarla de ahi usando el\n" + "caso C.")); detallePanel.add(new JLabel(detIconList.get(2))); detallePanel.validate(); } else if (comando.equals("det4")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 4: Ahora forme una cruz en la cara\n" + "superior, no importa que los colores\n" + "de los lados no esten en orden.")); detallePanel.add(new JLabel(detIconList.get(3))); detallePanel.validate(); } else if (comando.equals("det5")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 5: Aqui los casos A y B sirven para\n" + "intercambiar las piezas a las posiciones\n" + "mostradas por las flechas. La idea es poner\n" + "los colores de los lados en su lugar.")); detallePanel.add(new JLabel(detIconList.get(4))); detallePanel.validate(); } else if (comando.equals("det6")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 6: Ahora debe poner los vertices en\n" + "su lugar correcto, si hay uno ya en su lugar,\n" + "los casos A o B le serviran. Si necesitara\n" + "intercambias diagonalmente dos pares de\n" + "vertices, use primero el caso A y luego el\n" + "caso C le servira.")); detallePanel.add(new JLabel(detIconList.get(5))); detallePanel.validate(); } else if (comando.equals("det7")) { detallePanel.removeAll(); detallePanel.repaint(); detallePanel.add(new JTextArea("ETAPA 7: Solo faltaria girar los vertices\n" + "que lo necesiten. ATENCION: En esta parte\n" + "el cubo se vera que se desordena, pero al\n" + "final, volvera a ordenarse 'magicamente'.\n" + "Cuando haya girado un vertice y vaya por el\n" + "proximo, NO GIRE el cubo completo, SOLO GIRE\n" + "LA CAPA SUPERIOR hasta que el vertice elegido\n" + "quede en la posicion AFD.")); detallePanel.add(new JLabel(detIconList.get(6))); detallePanel.validate(); } } } /** * Extraido del Tutorial de Java "How to Use Buttons, Check Boxes, and Radio Buttons". */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = Frame.class.getResource(path); //error handling omitted for clarity... return new ImageIcon(imgURL); } }