¿Por qué la vista no ejecuta repaint() en update()?

Tengo problemas, al pintar una vista, siguiendo el patrón MVC.

El problema es que cuando el modelo indica que el objeto observable ha cambiado, se ejecuta la actualización de la vista, pero al llamar al repaint() no ejecuta su contenido. Lo que quiero pintar es una imagen, el problema puede ser que la clase extiende la vista, no sea apropiada (Canvas).

Al depurar, lo que sucede es que el modelo notifica a la vista que el objeto se ha modificado, luego ejecuta el método update (), pero no ejecuta el contenido de paint ().

El modelo se modifica cuando la “anguloRotacion”, en la que aumento o disminuyo, el ángulo de rotación de la imagen. Este código se encuentra dentro del método anguloRotacion (), dentro del modelo.

Si necesitáis más explicaciones o aclaraciones, por favor hacermelo saber. Realmente necesito resolver este problema.

Controller code:

/*  * To change this license header, choose License Headers in Project Properties.  * To change this template file, choose Tools | Templates  * and open the template in the editor.  */ package controlador;  import Auxiliares.Canon; import Auxiliares.Casilla; import Auxiliares.ContenedorFinal; import Vistas.*; import Vistas.VistaCanon; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.plaf.basic.BasicProgressBarUI;  /**  *  * @author ignacioaranguren  */ public class Controlador extends JFrame {      private JPanel contenedorFinal;     private JProgressBar barra;     private ActionListener ac;     private Timer t;     private int puntuacion = 0;     private DecimalFormat timeFormatter;     private JLabel etiquetaFin;     private JButton finalizar;     private Graphics2D offGraphics;     private Image offImage;     private Modelo modelo;     private VistaCanon vistaCanon;     private VistaBala vistaBala;     private VistaCasillas vistaCasillas;     private VistaCorazon vistaCorazon;     private VistaHaCaidoAgua vistaHaCaidoAgua;     private VistaSegundero vistaSegundero;     private VistaPuntuacion vistaPuntuacion;      public Controlador() {          setLayout(null);         modelo = new Modelo();         vistaCanon = new VistaCanon(modelo);          modelo.addObserver(vistaCanon);          modelo.initComponents();         timeFormatter = new DecimalFormat("00");         etiquetaFin = new JLabel("Juego finalizado");         etiquetaFin.setFont(new Font("Arial", Font.PLAIN, 35));         etiquetaFin.setBounds(250, 330, 300, 100);         etiquetaFin.setVisible(false);         finalizar = new JButton("Menu principal");         finalizar.setBounds(300, 410, 150, 30);         finalizar.addActionListener(new ActionListener() {             @Override             public void actionPerformed(ActionEvent e) {                 System.exit(0);             }         });         finalizar.setVisible(false);         contenedorFinal = new ContenedorFinal();         contenedorFinal.setBackground(Color.red);         contenedorFinal.setVisible(false);         contenedorFinal.setBounds(0, 0, 940, 900);          barra = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);         barra.setBounds(450, 730, 200, 40);         barra.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 2, true));         barra.setUI(new BasicProgressBarUI() {             @Override             protected void paintDeterminate(Graphics g, JComponent c) {                 Graphics2D g2d = (Graphics2D) g;                 int ancho = barra.getWidth();                 int alto = barra.getHeight();                  int espacioAncho = ancho;                 int espacioAlto = alto;                 barra.setPreferredSize(new Dimension(200, 40));                 double porcentajeProgres = barra.getPercentComplete();                  espacioAncho = (int) (espacioAncho * porcentajeProgres);                 if (porcentajeProgres <= 0.25) {                     g2d.setColor(Color.GREEN);                 } else if (porcentajeProgres > 0.25 && porcentajeProgres <= 0.5) {                     g2d.setColor(Color.yellow);                 } else if (porcentajeProgres > 0.5 && porcentajeProgres <= 0.75) {                     g2d.setColor(Color.orange);                 } else {                     g2d.setColor(Color.red);                 }                 Rectangle rec1 = new Rectangle(0, 0, espacioAncho, espacioAlto);                 g2d.fill(rec1);             }          });            ac = new ActionListener() {             @Override             public void actionPerformed(ActionEvent e) {                 modelo.BarraProgreso();             }          };          modelo.setBarra(barra);         modelo.setBotonFinalizar(finalizar);         modelo.setContenedorFinal(contenedorFinal);         modelo.setEtiquetaFin(etiquetaFin);         modelo.setTimerFormater(timeFormatter);          t = new Timer(35, ac);         t.start();          addKeyListener(new KeyAdapter() {             @Override             public void keyPressed(KeyEvent evento) {                 switch (evento.getKeyCode()) {                     case KeyEvent.VK_LEFT:                         modelo.anguloRotacion(1);                         break;                     case KeyEvent.VK_RIGHT:                         modelo.anguloRotacion(2);                         break;                     case KeyEvent.VK_ENTER:                         modelo.anguloRotacion(3);                         break;                     case KeyEvent.VK_ESCAPE:                                  repaint();                         modelo.salirJuego(JOptionPane.showConfirmDialog(null, "¿Volver al menú principal?", "Juego", JOptionPane.YES_NO_OPTION));                         break;                     case KeyEvent.VK_H:                         JOptionPane.showMessageDialog(null, "-Pulsa las teclas izquierda y derecha para mover el cañón.\n-Selecciona una "                                 + "intensidad mediante la barra de fuerza:\n   -Rojo = Disparar fuerte.\n   -Amarillo = disparar medio fuerte"                                 + ". \n   -Verde = disparar suave.\n-Pulsa Enter para disparar. \n-Durante el disparo puedes modificar su trayectoria mediante la teclas izquierda y derecha."                                 + "\n-La puntuación: \n   -Los cangrejos (+1). \n   -Los tesoros (+2). \n   -Las botellas de ron (-1) vidas.", "Cómo jugar", JOptionPane.QUESTION_MESSAGE);                         break;                 }                 requestFocus();             }             });          addWindowListener(new java.awt.event.WindowAdapter() {             @Override             public void windowClosing(java.awt.event.WindowEvent evt) {                 close();             }         });          setSize(940, 900);         setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);         add(finalizar);         add(etiquetaFin);         setResizable(false);         add(contenedorFinal);         add(barra);         setVisible(true);      }      @Override     public void paint(Graphics g) {         Graphics2D g2d = (Graphics2D) g;         Image fondo = new ImageIcon(getClass().getResource("/imagenes/fondo.jpeg")).getImage();         g2d.drawImage(fondo, 0, 0, null);         g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,         RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);         g2d.setFont(new Font("Marker Felt", Font.PLAIN, 30));         g2d.setColor(Color.white);         g2d.drawString("Cómo jugar, Pulsa H", 710, 330);         g2d.drawString("Pulsa ESC para salir", 710, 380);               Image img2 = new ImageIcon(getClass().getResource("/imagenes/fondoMapa.png")).getImage();         g2d.drawImage(img2, 30, 30, this);     }      private void close() {         if (JOptionPane.showConfirmDialog(rootPane, "¿Volver al menú principal?",                 "Juego", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {             System.exit(0);         }     }      } 

Model manipulation:

   package controlador;  import Auxiliares.Canon; import Auxiliares.Casilla; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Observable; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.Timer;  /**  *  * @author ignacio  */ public class Modelo extends Observable {      private double anguloRotacion, anguloMin, anguloMax;     private boolean teclaPresionada, flag, flagBala, pintarCasilla, balaAgua;     private JProgressBar barra;     private double vX, vY, x1, x2, x1Anterior, x2Anterior, alfa, escala, i;     private Timer animacion, timer;     private Canon canon;     private int progreso, x, y, puntuacion, vidas, posVidaX, contadorCasilla;     private Casilla[][] casilla;     private double posX[], posY[];     private BufferedImage imgB;     private Image img2, fondo, fondoMapa, vida, img;     private ArrayList<Casilla> arrayCasilla;     private JLabel etiquetaFin;     private JButton finalizar;     private JPanel contenedorFinal;     private byte seconds;     private short minutes;     private DecimalFormat timeformater;       public void setBarra(JProgressBar b){         this.barra = b;     }      public void setEtiquetaFin(JLabel f){         this.etiquetaFin = f;     }      public void setTimerFormater(DecimalFormat d){         timeformater = d;     }      public void setContenedorFinal(JPanel p){         contenedorFinal = p;     }      public void setBotonFinalizar(JButton b){         this.finalizar = b;     }       public void initComponents(){         seconds = 00;         minutes = 03;          timer = new Timer(1000, new ActionListener() {             @Override             public void actionPerformed(ActionEvent e) {                  if (seconds == 0 && minutes == 0) {                     timer.stop();                     etiquetaFin.setVisible(true);                     finalizar.setVisible(true);                     contenedorFinal.setVisible(true);                  } else if (seconds > 0) {                     seconds--;                     setChanged();                     notifyObservers();                  } else if (minutes > 0) {                     minutes--;                     seconds = 59;                     setChanged();                     notifyObservers();                 }              }         });         timer.start();          posX = new double[]{30, 79, 128.0, 177.0, 226.0, 275.0, 324.0, 373.0, 422.0, 471.0, 520.0, 569.0, 618};         posY = new double[]{30, 83.0, 136.0, 189.0, 242.0, 295.0, 348.0, 401.0, 454.0, 507.0, 560.0, 613.0, 613};         casilla = new Casilla[13][13];         inicializarCasillas();         anguloRotacion = Math.PI / 2;         vidas = 3;         anguloMax = 0.81986726449;         anguloMin = anguloMax = 2.32172538679;         teclaPresionada = false;         flag = false;         flagBala = false;         pintarCasilla = false;         balaAgua = false;         i = 0;         progreso = 0;         this.canon = canon = new Canon();         this.barra = barra;         arrayCasilla = new ArrayList<>();         llenarCasillas();     }      public void cargarImagenes() {         try {             img2 = new ImageIcon(getClass().getResource("/imagenes/fondoMapa.png")).getImage();             fondo = new ImageIcon(getClass().getResource("/imagenes/fondo.jpeg")).getImage();             vida = new ImageIcon(getClass().getResource("/imagenes/vida.png")).getImage();             img = new ImageIcon(getClass().getResource("/imagenes/BalaCanon.png")).getImage();             imgB = ImageIO.read(getClass().getResource("/imagenes/canon.png"));         } catch (IOException ex) {             Logger.getLogger(Modelo.class.getName()).log(Level.SEVERE, null, ex);         }      }      public void anguloRotacion(int direccion) {         switch (direccion) {             case 1:                 if (anguloRotacion > anguloMin && anguloRotacion < anguloMax) {                     anguloRotacion = anguloRotacion + 0.05;                 } else {                     anguloRotacion = anguloRotacion - 0.05;                 }                 setChanged();                 notifyObservers();                 break;             case 2:                 if (anguloRotacion > anguloMin && anguloRotacion < anguloMax) {                     anguloRotacion = anguloRotacion - 0.05;                 } else {                     anguloRotacion = anguloRotacion + 0.05;                 }                 setChanged();                 notifyObservers();                 break;              default:                 break;         }      } } 

View code:

package Vistas;  import controlador.Modelo; import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.util.Observable; import java.util.Observer;   public class VistaCanon extends Canvas implements Observer {      private Modelo m;      public VistaCanon(Modelo m) {         this.m = m;     }      @Override     public void paint(Graphics g) {         super.paint(g);         Graphics2D g2d = (Graphics2D) g;         g2d.setColor(Color.gray);         g2d.fillRect(30, 720, 646, 122);         AffineTransform tx = AffineTransform.getRotateInstance(Math.PI / 2 - m.getAnguloRotacion(), m.getImB().getWidth(this) / 2, m.getImB().getHeight(this) / 2);         AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);         tx.rotate(Math.PI / 2 - m.getAnguloRotacion());         System.out.println(tx.toString());          g2d.drawImage(op.filter(m.getImB(), null), 360, 740, null);     }      @Override     public void update(Observable o, Object arg) {         repaint();     }  } 

¿Por qué no recibo información envíada de app de terminal Bluetooth a modulo HM-10 en arduino?

Estoy intentando comenzar con el uso de bluetooth por medio de un modulo HM-10 y arduino UNO, estoy utilizando la app llamada “Serial Bluetooth Terminal” al parecer conecta correctamente con el dispositivo HM-10 pero a la hora de enviarle un “1” o “0” no lo recibe y por obviedad no lo demás que en mi programación arduino le estoy pidiendo que en este caso es encender un led. El código arduino es el siguiente:

#define RX 11 #define TX 10 #define pinLED 13 #include <SoftwareSerial.h>  SoftwareSerial bluetooth(TX, RX);  void setup() {    bluetooth.begin(9600);   bluetooth.println("Arduino Enabled, Bluetooth Test.");   Serial.begin(9600);   Serial.println("Arduino Enabled, Bluetooth Test.");   pinMode(pinLED, OUTPUT); }  void loop() {   byte BluetoothData;     if (bluetooth.available() > 0) {     switch (bluetooth.read()) {     case '0':       digitalWrite(pinLED, LOW);       bluetooth.println("Apaga el LED");       Serial.println("Apaga el LED");       break;     case '1':       digitalWrite(pinLED, HIGH);       bluetooth.println("Enciende el LED");       Serial.println("Enciende el LED");       break;     default:       bluetooth.println("Sin comando");       Serial.println("Sin comando");    }  }  delay(100); } 

Ojalá alguien pueda ayudarme he estado viendo preguntas similares y no son respondidas por lo regular, por el momento gracias.

¿Por qué bootstrap usa role=”form” en los formularios?

Cuando usas role="form" en un formulario el validador de W3C, lanza un warning:

El elemento form no necesita un atributo role

Por ejemplo:

<form class="form-inline" role="form">   <div class="form-group">     <label for="email">Email address:</label>     <input type="email" class="form-control" id="email">   </div>   <div class="form-group">     <label for="pwd">Password:</label>     <input type="password" class="form-control" id="pwd">   </div>   <div class="checkbox">     <label><input type="checkbox"> Remember me</label>   </div>   <button type="submit" class="btn btn-default">Submit</button> </form> 

La pregunta se encuentra parcialmente respondida aquí.

¿Es esto correcto?, si se incorpora para mejorar la accesibilidad ¿el problema estaría en el validador W3C?

¿Por qué mi aplicación hecha en React me da error 404 en todas las páginas salvo la principal?

Estoy intentando probar la versión de producción de una web que he hecho utilizando React, pero cuando ejecuto serve -s build y abro mi web, todas las páginas menos la principal me lanzan un error 404.

En el archivo Index.js envuelvo la llamada a App.js utilizando BrowserRouter:

  <BrowserRouter>     <App />   </BrowserRouter>, 

Y la navegación está definida en el archivo App.js utilizando react-router-dom. Se ve así:

          <Route exact path="/" component={Home} />           <Route path="/ilustraciones" component={Ilustraciones} />           <Route path="/galeria" component={Galeria} />           <Route path="/login" component={Login} />           <Route path="/visor" component={Loginvisor} />           <Route path="/visorstl" component={LoginvisorSTL} />           <Route path="/profile" component={Profile} />           <Route path="/DICOM" component={LoginVisorDICOM} /> 

Mi web, si es necesario mirar en otro lado, está aquí: https://github.com/rgomez96/Tecnolab (en la rama Develop)

¿Cómo puedo solucionar esto? No es mandatorio desplegar la web utilizando serve así que podría cambiarlo si fuera necesario.

¿Por que mi función no ejecuta el primer if en mi validación en Javascript?

¿Por que mi función no ejecuta el primer if en mi validación en Javascript? tengo este problema con mi código en javascript que si entra la función pero no las condiciones por lo tanto no entra la evaluación de los datos y envia los datos aun que los campos estes vacíos. No tengo idea cual es el error. Les dejo mi código html y mi javascript ojalá me puedan ayudar saludos.

Este es mi codigo js

function vale() {     alert("Entra la Fucncion");     var nombre, apellidos, correo, password, cofpassword, telefono, celular, expression, calle, colonia, ciudad, estado, cp, terminos;      nombre = document.getElementById("nombre").value;     apellidos = document.getElementById("apelli").value;     correo = document.getElementById("correo").value;     password = document.getElementById("contra").value;     cofpassword = document.getElementById("confcont").value;     telefono = document.getElementById("telf").value;     celular = document.getElementById("celu").value;     calle = document.getElementById("calle").value;     colonia = document.getElementById("colonia").value;     ciudad = document.getElementById("ciudad").value;     estado = document.getElementById("estado").value;     cp = document.getElementById("cp").value;     terminos = document.getElementById("terminos").checked;      expression = /\w+@\w+\.+[a-z]/;      alert("Entra la Fucncion"); if (nombre == "" || apellidos == "" || correo == "" || password == "" || cofpassword == "" || telefono == "" || celular == "" || calle == "" || colonia == "" || ciudad == "" || estado == "" || cp == "") {         alert("Todos los campos son obligatorios");         return false;     } else if (nombre.length > 30) {         alert("El nombre es muy largo");         return false;     } else if (apellidos.length > 80) {         alert("Los apellidos son muy largos");         return false;     } else if (correo.length > 100) {         alert("El correo es muy largo");         return false;     } else if (!expression.test(correo)) {         alert("El correo no es valido");         return false;     } else if (password.length > 20 || cofpassword.length > 20) {         alert("La contraseña es muy larga");         return false;     } else if (password != cofpassword) {         alert("La contraseña no coincide");         return false;     } else if (telefono.length > 10 || celular.length > 10) {         alert("Los numeros de telefono o celular son debe ser de 10 digitos");         return false;     } else if (isNaN(telefono)) {         alert("El telefono no es un numero");         return false;     } else if (isNaN(celular)) {         alert("El celular no es un numero");         return false;     } else if (calle.length > 100) {         alert("La calle es muy larga");         return false;     } else if (colonia.length > 50) {         alert("La colonia es muy larga");         return false;     } else if (ciudad.length > 50) {         alert("La ciudad es muy larga");         return false;     } else if (estado.length > 50) {         alert("La estado es muy larga");         return false;     } else if (isNaN(cp)) {         alert("El CP debe ser un numero");         return false;     } else if (terminos == false) {         alert("Deve de Aceptar los terminos y Condiciones");         return false;     } else {         return true;     }  } 

este es mi codigo html

<!DOCTYPE html> <html>  <head>     <title>Registro</title>     <meta charset="UTF-8">     <link rel="stylesheet" type="text/css" href="../css/header.css">     <link rel="stylesheet" type="text/css" href="../css/estilos.css">     <script src="validar.js"></script> </head>  <body>     <header>         <div class="Contenedor">             <div class="fondo">                  <a href="../index.html"><img src="../Img/UembekuaLogo.png" id="Logo" alt="Logo Uembekua" onsubmit="return vale()"></a>              </div>             <nav>                 <ul class="nav">                     <li><a href="../index.html">Home</a></li>                     <li><a href="Servicios.html">Servicios</a>                         <ul class="Submenu">                             <li><a href="Paquetes.html">Paquetes</a></li>                             <li><a href="Cursos.html">Cursos</a></li>                             <li><a href="Vacaciones.html">Vacaciones</a></li>                             <li><a href="Masajes.html">Masajes</a></li>                             <li><a href="Precios.html">Precios</a></li>                             <li><a href="Reservacion.html">Reserva tu Servicio</a></li>                         </ul>                     </li>                     <li><a href="Conocenos.html">Conocenos</a></li>                     <li><a href="Instalaciones.html">Instalaciones</a></li>                     <li><a href="Informacion.html">Info</a></li>                  </ul>             </nav>          </div>     </header>     <main>          <section>             <form style="padding: 20px; margin-top: 20px" method="post" action="reg.php" onsubmit=" return vale()">                  <font style="font-family: Rockwell;">                     <center>                          <table align="Center" cellpadding="5px" cellspacing="5px">                             <tr>                                 <td align="center" colspan="3">                                     <h2>Crear cuenta</h2><br>                                 </td>                              </tr>                             <tr>                                 <td>Nombre:</td>                                 <td colspan="2"><input type="text" placeholder="Nombre" id="nombre" name="nombre"><br></td>                             </tr>                              <tr>                                 <td>Apellidos: </td>                                 <td colspan="2"><input type="text" placeholder="Apellidos" id="apelli" name="apelli"><br></td>                             </tr>                                <tr>                                 <td>Correo:</td>                                 <td colspan="2"><input type="email" placeholder="example@correo.com" id="correo" name="correo"><br></td>                             </tr>                             <tr>                                 <td>Contraseña:</td>                                 <td colspan="2"><input type="password" placeholder="Contaseña" id="contra" name="contra"><br></td>                             </tr>                              <tr>                                 <td>Confirmar contraseña:</td>                                 <td colspan="2"><input type="password" placeholder="Contaseña" id="confcont"><br></td>                             </tr>                             <tr>                                 <td>Teléfono:</td>                                 <td colspan="2"><input type="text" placeholder="Tu teléfono" id="telf" name="telf"><br></td>                             </tr>                             <tr>                                 <td>Celular:</td>                                 <td colspan="2"><input type="text" placeholder="Tu celular" id="celu" name="celu"><br></td>                             </tr>                                <tr>                                 <td>Calle#:</td>                                 <td colspan="2"><input type="text" placeholder="Tu Calle#" id="calle" name="calle"><br></td>                             </tr>                             </tr>                                <tr>                                 <td>Colonia:</td>                                 <td colspan="2"><input type="text" placeholder="Tu colonia" id="colonia" name="colonia"><br></td>                             </tr>                             </tr>                                <tr>                                 <td>Ciudad:</td>                                 <td colspan="2"><input type="text" placeholder="Ciudad" id="ciudad" name="ciudad"><br></td>                             </tr>                               <tr>                                 <td>Estado:</td>                                 <td colspan="2"><input type="text" placeholder="Estado" id="estado" name="estado"><br></td>                             </tr>                             <tr>                                 <td>CP:</td>                                 <td colspan="2"><input type="text" placeholder="CP" id="cp" name="cp"><br></td>                             </tr>                                <tr cellpadding="5" align="center">                                  <td colspan="2"><input type="checkbox" name="terminos"><a href="https://www.timeinc.net/subs/privacy/termsofservice/pptos.html">Terminos y Condiciones</a></td>                                 </tr>                              <tr cellpadding="5" align="center">                                  <td colspan="2"><input type="submit" id="save" value="Registrarse"></td>                                 </tr>                          </table>                     </center>                 </font>             </form>             <center>              <a href="Reservacion.html"><input type="submit" name="cancel" value="Cancelar"></a>             </center>         </section>      </main>      <footer>         <p align="center" id="copyright">Uémbekua &mdash; Todos los derechos reservados &copy; </p>         <a href="#"><img src="../Img/facebook1.png" id="img1"></a>         <a href="#"><img src="../Img/instagram1.png" id="img2"></a>     </footer>  </body>  </html> 

¿Por que no me imprime php en archivo html?

quería saber por que no me imprimí en array en el archivo html.

El array es:

<?php     $  productos = array();     $  productos[0]['insumo_solicitado']="NOTEBOOK BGH B1354F I3 6006U/4GB/HD500/14";     $  productos[0]['cantidad_pedida']=10;     $  productos[0]['precio_unitario']=15000;     $  productos[0]['descuento']="20 insumos o mas, 3% de Dto.15000";      $  productos[1]['insumo_solicitado'] = "TABLET 7 VIEWSONIC VIEWPAD AW7M BLACK";     $  productos[1]['cantidad_pedida'] =20;     $  productos[1]['precio_unitario'] =2099;     $  productos[1]['descuento'] = "20 insumos o mas, 10% de Dto.";     $  cntpr=count($  productos); ?> 

y el archivo html donde quiero imprimir el array es:

<?php                                          for ($  i=0; $  i<$  cntpr;  $  i++) { ?>                                             <tr>                                             <td> <?php echo $  i;?> </td>                                             <td>                                                 <img src='plugins/images/products/6fc3a4.jpg' width='45' height="45" />                                             </td>                                             <td> <?php echo $  productos[$  i]['insumo_solicitado'];?> </td>                                             <td> <?php echo $  productos[$  i]['cantidad_pedida']; ?> </td>                                             <td> <?php echo $  productos[$  i]['precio_unitario']; ?></td>                                             <td>                                                 <span class="text-success"><?php echo $  productos[$  i]['descuento']; ?> </span>                                             </td>                                             <td>$   150000</td>                                             <td>$   0</td>                                             <td>$   150000</td>                                          </tr>                                          <?php                                         }                                         ?> 

El resultado es este:

introducir la descripción de la imagen aquí

de ante mano, muchas gracias! de paso digo que me parece una tonteria no poder publicar por falta de detalle.

¿Por que la cadena no devuelve la cantidad correcta de letras?

#include <stdio.h> #include <string.h>  int main(){ int longitud; char cad[20]; int i, j; int acum;  printf("Ingrese la cadena: "); scanf("%s", cad); longitud = strlen(cad);  for(i=0;i<longitud;i++){     if(cad[i]>='a' && cad[i]<='z'){         acum=acum+j;         j++;     }         }  printf("Hay %d letras\n",acum); return 0; } 

Hola quisiera saber a que se debe de que el programa no me pueda devolver la cantidad de letras correcta a la hora de ejecutarlo. Muchas gracias

¿Por qué me está dando un Null Pointer?

Veréis, estoy haciendo un programa simple para practicar herencias, interfaces, enumerados, listas, etc. Ya que estoy empezando de cero con Java y con la programación en general, entonces ando un poco perdido y no se que he hecho mal. Tengo la clase padre “Personajes” que tiene una hija que es “Heroes”, la clase padre tiene tres listas: una para los nombres, otra para los colores de los trajes y otra para los poderes, el problema viene cuando creo un objeto en la clase main, dandole valores a null a los tres atributos de lista para añadirle los elementos en las siguientes lineas, pues me marca todo bien, pero cuando ejecuto: PUM, Null Pointer, y no se porque… os dejo el código, aunque creo que lo he hecho como siempre:

Esta es la clase padre:

package modelos;  import java.util.ArrayList; import java.util.List;  import enums.ColorTraje; import enums.EnumVengadores; import enums.SuperPoder;  public class Personaje {  private List<EnumVengadores> nombreLst; private List<SuperPoder> superPoderLst; private Integer edad; private Boolean isMalvado; private Float estatura; private List<ColorTraje> colorTrajeLst;  public Personaje() {      superPoderLst = new ArrayList<SuperPoder>();     nombreLst = new ArrayList<EnumVengadores>();     colorTrajeLst = new ArrayList<ColorTraje>();  }  public Personaje(List<EnumVengadores> nombreLst, List<SuperPoder> superPoderLst, Integer edad, Boolean isMalvado,         Float estatura, List<ColorTraje> colorTrajeLst) {      this.edad = edad;     this.isMalvado = isMalvado;     this.estatura = estatura;      if (nombreLst != null) {          this.nombreLst = nombreLst;      }      else {          nombreLst = new ArrayList<EnumVengadores>();      }      if (superPoderLst != null) {          this.superPoderLst = superPoderLst;      }      else {          superPoderLst = new ArrayList<SuperPoder>();      }      if (colorTrajeLst != null) {          this.colorTrajeLst = colorTrajeLst;      }      else {          colorTrajeLst = new ArrayList<ColorTraje>();      }  }  public List<EnumVengadores> getNombreLst() {      return nombreLst;  }  public void setNombreLst(List<EnumVengadores> nombreLst) {      this.nombreLst = nombreLst;  }  public List<SuperPoder> getSuperPoderLst() {      return superPoderLst;  }  public void setSuperPoderLst(List<SuperPoder> superPoderLst) {      this.superPoderLst = superPoderLst;  }  public Integer getEdad() {      return edad;  }  public void setEdad(Integer edad) {      this.edad = edad;  }  public Boolean getIsMalvado() {      return isMalvado;  }  public void setIsMalvado(Boolean isMalvado) {      this.isMalvado = isMalvado;  }  public Float getEstatura() {      return estatura;  }  public void setEstatura(Float estatura) {      this.estatura = estatura;  }  public List<ColorTraje> getColorTrajeLst() {      return colorTrajeLst;  }  public void setColorTrajeLst(List<ColorTraje> colorTrajeLst) {      this.colorTrajeLst = colorTrajeLst;  } 

Esta es una clase hijo:

package modelos;  import java.util.List;  import enums.ColorTraje; import enums.EnumVengadores; import enums.SuperPoder;  public class Heroe extends Personaje { private Boolean isAvenger;  public Heroe() {      super();  }  public Heroe(List<EnumVengadores> nombreLst, List<SuperPoder> superPoderLst, Integer edad, Boolean isMalvado,         Float estatura, List<ColorTraje> colorTrajeLst, Boolean isAvenger) {      super(nombreLst, superPoderLst, edad, isMalvado, estatura, colorTrajeLst);     this.isAvenger = isAvenger;  }  public Boolean getIsAvenger() {      return isAvenger;  }  public void setIsAvenger(Boolean isAvenger) {      this.isAvenger = isAvenger;  } 

Y este es mi main:

package modelos;  import enums.ColorTraje; import enums.EnumVengadores; import enums.SuperPoder;  public class mainVengadores {  public static void main(String[] args) {     // TODO Auto-generated method stub      /*Personaje ironman = new Heroe();     ironman.setEdad(48);     ironman.getNombreLst().add(EnumVengadores.IRONMAN);     ironman.getColorTrajeLst().add(ColorTraje.AMARILLO);      System.out.println(ironman);*/       Personaje hulk=new Personaje(null, null, 45, true, 1.23f, null);      hulk.getNombreLst().add(EnumVengadores.HULK);     hulk.getColorTrajeLst().add(ColorTraje.VERDE);     hulk.getColorTrajeLst().add(ColorTraje.AZUL);     hulk.getColorTrajeLst().add(ColorTraje.AMARILLO);     hulk.getSuperPoderLst().add(SuperPoder.Super_Fuerza);      System.out.println(hulk);      } } 

Cuando ejecuto la clase main, me da como resultado un Null Pointer, ¿alguna ayuda? Mil gracias 🙂

¿Por qué httpbody de NSMutableURLRequest cambia caracteres de mi string en swift?

Actualmente trabajo en un poryecto de swift en el que el usuario puede subir fotografias a un servidor, para lograr esto codifico la imagen capturada a base 64 esto lo consigo con el sguiente código:

func convertImageToBasee64(image: UIImage){     let imageData = image.jpegData(compressionQuality: 1)     let base64String = imageData!.base64EncodedString()     return base64String } 

Posteriormente creo la variable que uso como parámetro

let imagenEnviar = convertImageToBasee64(image: imagenVistaPrevia.image!) let parametros = "imagen=" + imagenEnviar 

y por último ejecuto la clase de conexion a mi server.

let conexion:clsConexionIA = clsConexionIA.init(url: "miurl.php", params: parametros) conexion.request{(output) in   print(output) } 

esta es mi clase de conexión:

class clsConexionIA {    let URL: String    let PARAMS: String     init(url: String, params: String) {        self.URL = url        self.PARAMS = params.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!    }     func request(successHandler: @escaping (_ response: String) -> Void)->Void{        let request = NSMutableURLRequest(url: NSURL(string: self.URL)! as URL)        request.httpMethod = "POST"        request.httpBody = self.PARAMS.data(using: String.Encoding.utf8, allowLossyConversion: false)        let headers = ["Content-Type": "application/x-www-form-urlencoded"]        request.allHTTPHeaderFields = headers         let task = URLSession.shared.dataTask(with: request as URLRequest) { datos, respuesta, error in            if error != nil {                successHandler(String(describing: error));            } else {                let responseString = NSString(data: datos!, encoding: String.Encoding.utf8.rawValue)                print("RESPUESTA \(responseString)")                successHandler((responseString as String?)!);            }        }        task.resume()    } } 

Mi problema es que del lado de mi servidor php estoy recibiendo una cadena que no es un base64 válido, por lo que la imagen se guarda corrupta-dañada.

He utilzado Charles Proxy para inspeccionar los parametros que le paso a mi servidor, y en notado que el string que se envía al server es distinto al que obtengo al inspeccionar en tiempo de ejecución la linea self.PARAMS.data(using: String.Encoding.utf8, allowLossyConversion: false)

¿a qué se debe esto y como puedo corregirlo? Yo imagino que la parte .data(using: String.Encoding.utf8, allowLossyConversion: false) hace alguna modificación a mi string, pero no he encontrado la forma de corregir esta situación. También he intentado obtener el .data sin el parámetro allowLossyConversion pero no noto cambio alguno.

Algunos de los cambios que noto en el string es, por ejemplo, que me reemplaza los caracteres + por espacios en blanco, también la longitud de caracteres es distinta, por lo que forzar un replace de espacios del lado del servidor no me funciona.

Se que hasta este punto self.PARAMS = params.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! mi string base64 es válido porque lo inspecciono en tiempo de ejecución, copio su valor y lo pego en algún decodificador online y la imagen se genera correctamente.

Espero y alguien pueda ayudarme, gracias de antemano comunidad!