✅✅ ✅ ✅ ✅ Todos mis cursos gratuitos 👉 www.pildorasinformaticas.es ✅✅ ✅ ✅ ✅ 🚀 ¿Quieres ejercicios? ¿Quieres más temario? 👉 www.pildorasinformaticas.es/course/java-tutorizado/🚀 🚀 ¿Quieres que te resuelva las dudas de Java? 👉 www.pildorasinformaticas.es/course/java-tutorizado/ 🚀 💥💥💥 Siempre seguiré subiendo cursos gratuitos por aquí. Gracias a todos por seguirme. 💥💥💥
Excelente explicación, voy algo atrasado con los vídeos pero espero que el contenido de este curso java siga aumentando. Gracias por hacer estos vídeos.
Hola a todos.Como siempre doy las gracias a Juan por exelente curso.En relacion a patrones de diseño,tambien me parece aspecto muy importante.Yo,que soy autodidacta,tengo ese problema.Al intentar hacer el programa propio(reloj por ejemplo), no tengo ni idea de que empezar,no tengo orden predeterminado. De momento tengo una idea y hago lo siguiente.Intento comentar programas hechas por Juan en los videos(una especie de pseudocodigo).Eso me ayuda entender mejor funcionamiento del programa.Aqui le cuelgo ejemplo del video 53 :temporizador. Disculpad por fallos y si alquien quiere colgar su vercion de pseudocodigo seria interesante analisarlo.Saludos a todos
/*este programa muestra hora actual cada 3 segundos acompañandolo con un beep. *para eso creamos un objeto miReloj y le pasamos como parametros(intervalo de ejecucion y sonido) *antes creamos una clase Reloj donde declaramos variables:int intervalo y boolean sonido.El constructor tendra esos parametros:intervalo y sonido *En esa misma clase declaramos y definimos un metodo enMarcha() para poner en marcha nuestro objeto miReloj. *para eso dentro del metodo tenemos que crear objeto temporizador de clase Timer que va a encargar a arrancar nuestro programa *para instanciar objeto de clase timer necesitamos 2 parametros(intervalo de ejecucion de tipo int e un objeto de tipo actionListener) *con el metodo start() arrancamos temporizador *como uno de los parametros para crear temporizador es de tipo ActionListener creamos clase DameLaHora la que implementamos con interfaz AccionListener *y por regla esa clase implementa el metodo de interfaz (public void actionPerformed(ActionEvent evento). *dentro del metodo se describe el evento:1.creamos objeto de tipo Date que nos muestra hora actual 2.ponemos mensaje que queremos mostrar y hora *3.con merodo beet()declase Toolkit asignamos sonido al evento. *En clase main instanciamos objeto miReloj de clase Reloj con parametros(intervalo,true) y lo arrancamos con metodo enMarcha *para que el programa no muera en instante creamos una ventana donde escribimos "Pulse Aceptar para terminar" *para ese fin usamos metodo showMessageDialog de clase JOptionPane con parametros(null,mensaje a mostrar). *Con ayuda del metodo exit() de clase System(parametro 0)salimos del programa. */ package poo29; import javax.swing.*; //contiene clase JOptionPane import java.awt.event.*; //contiene interfaz ActionListener import java.util.*; //contiene clase Date import javax.swing.Timer; // importamos clase Timer para evitar confusion(hay varios clases Timer pertenecientes a diferentes paquetes) import java.awt.Toolkit; // importamos clase Toolkit de paquete java.awt public class PruebaTemporizador2 { public static void main(String[] args) { Reloj miReloj=new Reloj(3000,true); miReloj.enMarcha(); // ponemos en marcha reloj usando el metodo enMarcha JOptionPane.showMessageDialog(null,"Pulse Aceptar para terminar"); //para que programa no pare antes de tiempo System.exit(0); //instruccion de salir de programa } } class Reloj{ public Reloj(int intervalo,boolean sonido){ this.intervalo=intervalo; this.sonido=sonido; } public void enMarcha(){ ActionListener oyente=new DameLaHora2(); Timer temporizador=new Timer(intervalo,oyente); //elaboramos temporizador temporizador.start(); //arrancamos temporizador } private int intervalo; private boolean sonido; private class DameLaHora2 implements ActionListener{ //clase interna @Override public void actionPerformed(ActionEvent evento) { Date ahora=new Date(); System.out.println("Te doy la hora cada 3 segundos"+ahora); if(sonido==true){ Toolkit.getDefaultToolkit().beep(); } } //fin de clase interna
Genialmente explicado como siempre, lástima que a estas alturas de curso no se me acaba de meter en la cabeza la POO y me cueste mucho adivinar/crear el código que tu después escribes.
Grande Juan!!! indiscutiblemente tienes un don para la pedadogia que no es facil y mas aun por videos. Consulta para quien pueda responderme, saben donde puedo practicar? hay alguna pagina donde me permita ejercitar todo los visto hasta ahora?
En el caso de Linux MInt no reproduce sonido pero eso se debe a las preferencias de sonido al saltar una ventana de advertencia, emergencia, error etc, solo es cuestión de colocar sonido en esa parte, me imagino que los usuarios de escritorio plasma (KDE) les dará un sonido por default, interesante seria poder colocar un sonido propio que uno desee y no el del sistema operativo.
hay algo que me confunde en la clase reloj en el metodo constructor @CARMEN BÁEZ CARACOL coloca el parametro sonido como final, sin embargo funciona aunque cambie el valor
Tengo una pregunta, porque si coloco la instrucción del metodo Toolkit.getDefaultToolkit().beep(); En el main no me emite el sonido a diferencia que colocándolo dentro del metodo public void actionPerformed(ActionEvent e) {}?
A mí tampoco me funcionaba el beep con windows 10. Era porque tenía desactivados los sonidos del sistema. Me fuí a sonido y en la pestaña sonidos activé en combinación de sonidos, predeterminado de windows.
En linux mint el Toolkit no me emite ningún sonido. No se si será por alguna configuración mía o es por Java. Ya lo investigaré. Lo comento por si a alguien también le ocurre.
Todavía no pero me imagino que la cosa tendrá que ver con el driver de sonido que tengamos seleccionado en linux. Hay dos tipos de drivers para audio en linux, Alsa y Pulse.
Hola Juan, me gustaría preguntarte si sabes de alguna web o libro donde se hable de patrones de diseño. Por que me parece que es importante tener un buen diseño antes de tratar implementar nada ¿no?. ¿O vas a explicarlo más adelante? Gracias por todo. A ver si llegamos a hacer todo el curso.
Paul Cano Voy a explicarlo más adelante. Como es un curso que comienza desde 0 (pensado para gente que no sabe programar en ningún lenguaje) en mi humilde opinión hablar de patrones antes de ponernos a programar no es muy estimulante. Pero lo veremos. En cuanto a libros que hablen de ello, la verdad no conozco ninguno. Yo de patrones solo tengo apuntes de universidad. Un saludo
Yo tampoco es que sepa mucho. En la universidad, lo máximo que hice fue un Busca Minas. Pero recuerdo que mi profesor nos aconsejaba que no estaba demás saberse Patrones de diseño en un futuro. Si lo vas a explicar más adelante, estupendo. Muchas gracias por contestar. Un saludo.
Tengo 1100 vídeos en el canal (me resulta imposible acordarme del código). Pruébalo y si funciona, perfecto. En programación "siempre hay varios caminos que te llevan a Roma" y yo no tomo siempre el más corto. Un saludo!
Hola Juan queria preguntale lo siguiente: cuando escribo la siguiente instrucción import javax.swing.Timer; a los efectos de evitar el conflicto. eclipse me dice que Timer no es accesible debido a una restriccion en la libreria , le pregunto como podría solucionar este problema
Mira a ver si se trata de el mismo error que comenta este compañero (pero con la librería Timer). Pincha aquí: www.pildorasinformaticas.com/archivos/java/JOptionPane_problema.jpg Un salduo!
Hola juan, sigo tu curso de java java desde el primer video y hasta este punto tenia actividades para practicar por mi cuenta ya que estoy haciendo un modulo superior de Desarroyo Aplicaciones Web. El caso es que no profundizan tanto java y yo quiero aprender mas y se que haciendo actividades que te planteen un problemas te ayuda a aprender. El caso es que queria preguntarte si sabes de alguna paguina donde me pueda descargar actividades para reforzar lo aprendido. enhorabuena por el canal me ha ayudado un monton!!
hola profesor... desde ya gracias nuevamente...lo único que no me quedo bien claro es cuando elegir crear clases internas o crear métodos de acceso setters y getters ... espero ver la luz pronto!
Poco a poco... Una clase interna la crearás cuando tengas dos clases que tengan una estrecha relación entre sus métodos y sus campos. En este escenario casi siempre necesitamos que los métodos de una clase y otra puedan acceder a los campos de cada una de las clases. También decirte que la mayoría de las veces hay alternativas a la hora de crear el programa para prescindir de las clases internas, pero el código se complica y alarga. En este sentido las clases internas vinieron para simplificar el código. Un saludo!!
Salto un error en: private class DameLaHora2 implements ActionListener{ public void actionPerformed(ActionEvent evento){} pero se soluciona importando: import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
Buen dia profe! le hago una consulta muy basica... en todos los programas que creamos anteriormente la instrucción system.out.printl se encontraba en el metodo Main, sin embargo en este caso, se encuentra dentro de la clase (o mas bien del método). Mi pregunta es porqué lo programamos esta sentencia de esta manera? Gracias y saludos!
Hola !! La instrucción de imprimir en consola (System.out.println) puede ir colocada donde quieras o donde lo necesites. No es obligatorio que vaya siempre en el main. El método main, tal y como se explica en el curso, es el método desde el que se inician todas las aplicaciones de Java (casi todas). Como aún vas por el vídeo 35 y estás en los comienzos, todos los programas que se han hecho hasta este punto son extremadamente sencillos y no tienen casi métodos aparte del main. Observarás, a medida que avances en el curso, como los programas pueden tener multitud de métodos y clases y colocarás en cada uno de ellos lo que necesites. Un saludo!!
Gracias Profe, ahora si entendi. Voy de a poco. Llegare hasta el final! todos los dias estoy de 4 a 5 horas mirando sus videos, practicando en Eclipse... Gracias infinitas!!!!!
Hola buenas! Tengo una pregunta que quizás sea absurda, puede que esté despistado pero, ¿por qué en este segundo ejemplo no hemos necesitado implementar actionListener?
y si creas una clase interna dentro de la clase interna DameLaHora2 seguiría pudiendo acceder a las variables sonido e intervalo? o habría que crear los correspondientes getters?
No recuerdo ya el código de este vídeo (hace tiempo que lo hice) pero no. Que la clase sea interna no implica que se esté instanciando por instanciar la clase que la envuelve. Un saludo!
También me salía ese error, lo solucioné aplicando la sugerencia de Eclipse de crear el método que aparece allí para después borrarlo, luego me señaló que había una llave de más.
Profe no entiendo la sintaxis de la instrucción Toolkit.getDefaultToolkit().beep(); Entiendo que está utilizando el método estático de toolkit llamado getdefault y creo yo que hasta ahí da como resultado el sonido por defecto del sistema operativo y luego se reproduce con el método beep. No sé si estoy equivocado, Java permite ejecutar 2 métodos de esa manera?
Hola !! Sí, Java permite este tipo de encadenamiento de métodos al igual que ocurre con otros lenguajes. El método que reproduce el sonido es beep(). getDefaultToolkit lo que hace es obtener los diferentes componentes nativos del sistema operativo, entre ellos el sonido. O sea, que estás bien encaminado con lo que dices. Un saludo!!
Hola. Cuando añado la sentencia para hacer sonar el "beep" con cada refresco del contador, la ventana del JOptionPane me parpadea medio segundo. Concretamente, en ese medio segundo pasa a verse en el modo oscuro en el que tengo configurado el Windows 10. El IDE que utilizo es el Eclipse. ¿A alguien más le pasó algo parecido y tiene idea de cuál es el motivo? Gracias.
buen dia prof. Juan, estoy realizando este curso, y hasta ahora todo muy bien, pero en esta leccion y la anterior me da un error, a pesar que he copiado las lineas identicas a como ud las tiene... eso con la finalidad de verificar si la forma como yo la habia hecho estaba mal... mi pregunta con que eclipse trabaja ud y la version, yo baje el eclipse Mars Release (4.5.2)
hola juan, tengo una duda desde muy atras y es con los paquetes, he seguido el curso con netbeans y todo bien pero para cada practica tengo que crear nuevos proyectos, por que si creo una nueva clase y aunque este en paquete distinto y ejecuto el programa en el play solo se me ejecuta un solo main, por ejemplo en la practica temporizador me salio bien pero cree una nueva clase en paquete distinto y la llame temporizador2 y cuando ejecuto lo que sucede es que se ejecuta el main de temporizador osea el primer ejemplo que creamos
no, no la importo, solo la creo y listo, me dijeron en un foro que en netbeans hay que crear proyectos nuevos cada ves que vay a realizar una practica diferente, pero no se si sera cierto, y tengo un recuerdo de hace mucho que vi que alguien cambiaba desde netbeans que cambiaba la clase que se ejecutabab, creo que debe ser una diferencia entre netbeans y eclipse, me intirga
+juan baque Hola !! Echa un vistazo en la API a la clase StringUtils. esta clase tiene un método static isNumeric, que evalúa si un String es numérico o no
Buenas noches, Juan, no me explico porque no me suena, si lo he hecho igual que tu, no tengo desactivado el sonido, ni nada de eso, funcionan correctamente, pero no consigo hacer que suene cada vez que enseña la hora por pantalla. Qué podría ser?. gracias.-
Algún fallo que no ves (suele ocurrir) o que el beep de tu ordenador no funciona. Puedes copiar y pegar todo tu código por aquí para que yo u otra persona podamos comprobar si hay errores. Un saludo!
@@pildorasinformaticas import javax.swing.*; import java.awt.event.*; import java.util.*; import javax.swing.Timer; import java.awt.Toolkit; public class PruevaTemporizador2 { public static void main(String[] args) { // TODO Auto-generated method stub Reloj mireloj=new Reloj (); mireloj.enMarcha(3000,true); JOptionPane.showMessageDialog(null, "Pulsa la Tecla para Terminar");
System.exit(0); } } class Reloj{
public void enMarcha(int intervalo, final boolean sonido){ class DamelaHora2 implements ActionListener{ public void actionPerformed(ActionEvent evento){ Date ahora= new Date(); System.out.println("Te pongo la hora cada 3 sg.: "+ ahora); if(sonido){ Toolkit.getDefaultToolkit().beep(); } } } ActionListener oyente=new DamelaHora2(); Timer mitemporizador=new Timer(intervalo,oyente); mitemporizador.start(); }
@@carmen7598. Saludos. Primeramente comentar que esta estructura de código creo que pertenece a un vídeo posterior (aunque no estoy seguro lo comento por si alguien trató de interpretar infructuosamente las líneas de código comparándolas con las del vídeo). En segundo lugar, he probado el código que ha dejado escrito y los pitidos se emiten correctamente, en mi caso, una máquina Ubuntu 18.04. Siendo que el código no presenta problemas en la consecución de los fines requeridos para este vídeo, no sería arriesgado pensar que el problema tenga que ver con la configuración (no sé cuál) de su equipo.
@@antoniol.9340 hay algo que me confunde en la clase reloj en el metodo constructor Carmen coloca el parametro sonido como final, sin embargo funciona aunque cambie el valor
@@carmen7598 Hola, buenas tardes, Igual ya pasó mucho tiempo, copié tu código tal cual esta en tu comentario, lo pegué en mi PC y si me emite sonido. Debe ser, como comenta el profesor Juan, un problema con el sonido de tu equipo. Que tengas un excelente día. Saludos,
Una pregunta fuera de contexto cuando implementamos una interfaz Jefes por decirlo asi y esta extiende de Trabajador es obligatorio que mi clase que implementa jefes lleve tambien los metodos abstractos de la interfaz trabajador o solo de la misma jefes, Saludos Ingeniero y un agradecimiento por sus cursos de antemano!
¿Podriamos decir que con las clases internas también estamos heredando? Porque igual así, podemos hacer herencia “múltiple” de forma enmascarada, ya que, la clase interna no tiene que extender pero podríamos extender de otra clase externa a la clase interna. ¿Se podría?
Dejo un pequeño aporte para los que usan linux y no les suene el sonido. Tienen que poner a correr el modulo pcspkr Con el siguiente comando: sudo modprobe pcspkr Solo lo probre en distros basadas en ubuntu asi que no se si sirva en otras distros.
gracias por los tutos he quiero preguntarle la clase DameLaHora eclipse me la marca como error y no he podido ejecutar el codigo.espero su respusta, gracias...
quite el System.exit(0): e igual me cerro el programa al pulsar el boton del message dialog. para que es System.exit? realmente se necesita en este ejercicio?
+jerry ponce No recuerdo el código de este vídeo, pero si lo quitas y funciona igual no hará falta entonces. System.exit(0) hace que el flujo de ejecución salga del programa. Un saludo!!
+jerry ponce Sin el System.exit(0) no se a ti pero a mi me tarda como 1 segundo o 2 en acabar la ejecución con lo que ese segundo o dos cuenta para el total de tiempo que ha estado el programa en ejecución.
mmm! interesante lo que dices, en el mio no note mucho tiempo en cerrarse sin el system.exit pero lo voy a hacer con ambos para checar la diferencia, Gracias.
Buen Día Juan, me surge una inquietud, ¿por que una clase interna No static no puede crear métodos staticos únicamente solo cuando la clase interna sea static? gracias :)
Mi estimado amigo, primero para felicitarte por el exelente trabajo que estas realizando, y con otra inquietud trabajo con Netbeans en un sistema Windows 8.1 y la novedad que tengo es que no me suena el pitido, he buscado en foros y no encuentro la solucion, sabes cual podria ser el problema? sigo al pie todos tus videos, un Saludo.
Hola Juan, tengo todo el código implementado correctamente pero la sentencia Toolkit.getDefaultToolkit().beep() no reproduce ningún sonido. He estado inspeccionando mis ajustes de sonido y no veo nada extraño. Tengo Windows10. Un saludo y muchas gracias por tus vídeos, de verdad. Son excelentes!
Gracias por el comentario. Pues la verdad no sabría decirte dónde puede estar el origen del problema... Siento no ser de más ayuda en esta ocasión. Un saludo!!
Buenas tardes No he podido descubrir por que me da un error public void enMarcha() { ActionListener oyente = new DameLaHora(); Timer miTemporizador = new Timer(intervalo, oyente); miTemporizador.start(); } el error me sale en new Timer(intervalo, oyente); y me dice que el constructor es undefined lo tengo tal cual lo tienes tu solo cambio el nombre del paquete ya que los estoy separando del resto de ejemplos. gracias por tu ayuda
holaaa, me pueden ayudar tengo esta duda desde el vídeo 52,53,54 estamos trabajando con una interfaz predefina ActionListener(); la cual nos obliga a incluir el método ActionPerformed(ActionEvent) que recibe un parámetro llamado ActionEvent, entonces mi pregunta es: que papel juega el parámetro de ese método? si a la final cuando lo usamos no le pasamos nada al parámetro, eso se puede hacer?? o es que todavía no entiendo después de tres vídeos :s :s ayuda plis..
Hola, tengo un problema con el código, el OS que estoy usando es Windows 10 y el beep no se reproduce. Tienen idea de que podrá ser? Ya revise la configuración de windows y los sonidos están activados. Desde ya, gracias por la ayuda. Dejo el cod: package poo; import javax.swing.*; import java.awt.Toolkit; import java.awt.event.*; import java.util.*; import javax.swing.Timer; public class prueba_temporizador { public static void main(String[] args) { // TODO Auto-generated method stub damelahora oyente=new damelahora(); Timer mi_temporizador=new Timer(5000,oyente); mi_temporizador.start(); JOptionPane.showMessageDialog(null, "pulsa aceptar para detener"); System.exit(0); Toolkit.getDefaultToolkit().beep(); } } class damelahora implements ActionListener{ public void actionPerformed(ActionEvent e){ Date ahora=new Date(); System.out.println("Te pongo la hora cada 5 segundos" + ahora); }
Me sucede algo curioso con la interfaz ActionListener porque en el ejemplo anterior no me daba error cuando lo ejecutaba pero ahora si y importe import java.awt.event.ActionEvent; import java.awt.event.ActionListener; y se me quitó el error, no entiendo por qué ahora si me da error y antes no! Es confuso!
+Astrid Bompart Si posteas el codigo en el mensaje ayudaria mucho, aunque es muy probable que sea un error de sintaxis, en error de compilacion en el IDE te puede aparecer un mensaje que te da una idea del error que esta ocurriendo.
+Astrid Bompart A mi me pasaba lo mismo, el error era que habia escrito: import java.awt.Event.*; que te lo importa java si le das enter cuando te salen las sugerencias, y el que debes importar es java.awt.event.*; que no es lo mismo.
UNA CONSULTA PILDORASINFORMATICAS, TU COMO TE DISTE CUENTA QUE TENIAS QUE USAR PRIMERO EL METODO getDefaultToolkit() Y RECIEN AHI LLAMAR AL METODO beep() SI AL TRADUCIR TODO NO TE DICEN QUE PARA USAR EL BEEP() ANTES SE TIENE Q USAR EL GETDEFAULTTOOLKIT() ???? EXPLICAAA !!!
alguien sabe donde puedo leer mas sobre este tipo de metodos?: Toolkit.getdefaulttoolkit().beep(); me refiero al tema de que colocamos un . y otro metodo despues de haber usado un metodo
Hola. He intentado descubrir por mi cuenta como implementaste la linea de codigo donde se usa beep(); , sin embargo, quize tambien saber como es que se usa el JOptionPane.showInputMessage(); , porque creo es algo similar, y al intentar entender por mi cuenta desde la documentacion de la API de java, no encuentro solucion concreta. Si he visto todos los videos del curso anterior a este, y me es muy dficil entender la diferencia entre extender de una clase abstracta, a solo implementar los metodos que tiene. Tambien no entiendo el porque poner Toolkit antes del metodo, ya que no es static, ademas, eso de encadenar los metodos no lo vimos :(, enserio necesito ayuda. Si existe alguna pagina o ducumento o libro donde expliquen eso, lo agradecere mucho, o si pudieras explicarmelo rapido y consciso, tambien :). De antemano. Gracias.
+craftiernemesis Hola !! Te pregunto lo siguiente ¿Has mirado en la API de Java el método getDefaultToolkit de la clase Toolkit que se utiliza en la instrucción del vídeo: Toolkit.getDefaultToolkit().beep() ? Necesito que me respondas a esto antes de seguir aclarándote la ayuda. Un saludo
Ooo..ya, si es static el metodo, gracias, me habia confundido creyendo que las clases tambien podian serlo, ahora, si no existiera este video u otra informacion, como sabria yo que primero debo crear el Default Toolkit y luego encadenar el beep()? podria incluso encadenar otro recurso de esa clase en la misma linea?. Saludos, y gracias por contestar :D.
jejejeje, si no hubiera nadie que te lo explicara sería difícil que tú solo averiguaras tal cosa. Pero para eso están los libros y los cursos... Un saludo !!
Una pregunta?? estoy utilizando linux pero en mi caso no sonó, alguien de casualidad que sepa por que?? o si hay otra instrucción que deba poner, les agradecería bastante..
hola no me aclaro con los del punto por ejemplo esta classe Toolkit.getDefaultToolkit().beep(); esta llamado dos methodos a la vez o getDefaultToolkit() es una classe que llama a methodo beep() o getDefaultToolkit() es un methodo que el methodo beep() esta el interior?. igual que el System.out.println(). entiendo los codigos con los puntos de esta manera = e.dame_nombre()+e.dame_sueldo()+e.dame_fecha_contrato() se que el primero(System) es una classe y el tercero(println()) un methodo pero el segundo(out) no se si es un methodo o una classe. Toolkit.getDefaultToolkit().beep() es diferente de System.out.println(). necesito tu ayuda para superarlo gracias y un saludo
Hola, yo también tenía la misma duda pero revisando más abajo tienes una respuesta de Juan al usuario SONGXISTO en el que explica el por qué de esto. Son dos métodos distintos y se puede invocar dos métodos a la vez, la clase simplemente es toolkit. Mi duda es, si el método beep() es dinámico (creo que se llamen así los métodos no estáticos), por qué no instancias un objeto de tipo toolkit? Toolkit miSonido = new Toolkit(); miSonido.beep(); Sin embargo, simplemente al intentar crear en eclipse un objeto de tipo toolkit me da error y me dice que no se puede instanciar un objeto de tipo toolkit. Hasta donde yo se las clases abstractas se pueden instanciar igual que las clases normales, y si no se pueden instanciar, por qué dice la API que tiene un método constructor Toolkit()? Creo que tengo un buen jaleo... Espero tu respuesta maestro, muchas gracias por todo.
Todo lo que dices es correcto excepto que las clases abstractas se pueden instanciar. Una clase abstracta no se puede instanciar. Respecto a lo del constructor de la clase abstracta, existe para que lo utilices desde las clases hijas con la instrucción "super". Quizá este link te pueda aclarar algo: es.stackoverflow.com/questions/228/clase-abstracta-con-constructor Un saludo!!
Muy buenas Juan tengo un error en el código pero no consigo resolverlo, he hecho 2 veces el vídeo y no consigo resolverlo. Me sale este error: Exception in thread "main" java.lang.Error: Unresolved compilation problem: No enclosing instance of type PruebaTemporizador2 is accessible. Must qualify the allocation with an enclosing instance of type PruebaTemporizador2 (e.g. x.new A() where x is an instance of PruebaTemporizador2). at poo.PruebaTemporizador2.main(PruebaTemporizador2.java:16) El error me lo da en la linea que pone: Reloj mireloj=new Reloj(3000,true); Te pego todo el código por si te lo puedes mirar porque ya no se que puede estar mal, aquí va: package poo; import javax.swing.*; import java.awt.Toolkit; import java.awt.event.*; import java.util.*; import javax.swing.Timer; public class PruebaTemporizador2 { public static void main(String[] args) { // TODO Auto-generated method stub Reloj mireloj=new Reloj(5000,true);
mireloj.enMarcha(); JOptionPane.showMessageDialog(null, "Pulsa aceptar para terminar"); System.exit(0); } class Reloj{ public Reloj(int intervalo,boolean sonido){ this.intervalo=intervalo; this.sonido=sonido;
} public void enMarcha(){ ActionListener oyente= new dameLaHora2(); Timer miTemporizador=new Timer(intervalo,oyente); miTemporizador.start(); }
private int intervalo; private boolean sonido; private class dameLaHora2 implements ActionListener{ public void actionPerformed(ActionEvent evento){ Date ahora= new Date(); System.out.println("Te pongo la hora cada 3 sg "+ahora); if(sonido){ Toolkit.getDefaultToolkit().beep(); } } } } }
Ayuda no puedo ejecutar porque me sale el error en la clase DameLaHora2: package poo; import javax.swing.*; import java.awt.event.*; import java.util.*; import javax.swing.Timer; import java.awt.Toolkit; public class PruebaTemporizador2 { public static void main(String[] args) { // TODO Auto-generated method stub Reloj mireloj=new Reloj(3000, true); mireloj.enMarcha(); JOptionPane.showMessageDialog(null, "Pulse Aceptar para terminar"); System.exit(0); } } class Reloj{ public Reloj(int intervalo, boolean sonido){ this.intervalo=intervalo; this.sonido=sonido; } public void enMarcha(){ ActionListener oyente=new DameLaHora2(); Timer mitemporizador=new Timer(intervalo, oyente); mitemporizador.start(); } private int intervalo; private boolean sonido; private class DameLaHora2 implements ActionListener{ public void actionPerformer(ActionEvent evento){ Date ahora=new Date(); System.out.println("Te pongo la hora cada 3 seg " + ahora); if(sonido){ Toolkit.getDefaultToolkit().beep(); } } } }
Hola !! Error de sintaxis aquí: public void actionPerformer(ActionEvent evento){.... Es actionPerformed terminado en "d" y no en "r". Todos los IDE marcarán la clase como error. Si dejas el ratón quieto encima del error es fácil de averiguar. Un saludo!!
muy buenas profe no se por que me sale error en private class Damelahora implements ActionListener le doy vueltas y vultas y nada que sale package clasesinternas; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; import javax.swing.Timer; import java.awt.Toolkit; /** * * @author JONATHANP */ public class Temporizador { public Temporizador(int intervalo, boolean sonido){ this.intervalo=intervalo; this.sonido=sonido; } public void iniciar(){ ActionListener oyente= new Damelahora(); Timer miTemporizador=new Timer(intervalo,oyente); miTemporizador.start(); } private int intervalo; private boolean sonido; private class Damelahora implements ActionListener{ public void ActionPerformed(ActionEvent evento){ Date ahora=new Date(); System.out.println("LA HORA CADA 5S: "+ahora); if(sonido==true){ Toolkit.getDefaultToolkit().beep(); } } } }
Es la primera vez que veo eso de poner un metodo detras de otro... Toolkit.getDefaultToolkit().beep();... Podrias decirme exactamente que hace? Si tiene un nombre o algo? He visto todos los videos anteriores y no lo he visto. Talvez se me paso.
A ver asi explicando a grandes rasgos no se muy bien como estara programada la clase abstracta toolkit pero eso de llamar a un metodo detras de otro es simple pongamos un ejemplo tenemos 2 clases(clase A y clase B) y el main . Supongamos que en tu clase A creas un metodo que llamas "imprimirmensaje" ( Este metodo lo que hace es imprimir un mensajito por pantalla) y la clase B es una clase con sus variables y un objeto de la clase A (es decir de la clase anterior), suponiendo que en la clase B creas el constructor y los getter y setters(entiendo que sabes lo que son los getters y setters si no dimelo) correctamente si tu ahora en el main creas un objeto de la clase B podrias acceder a la clase A pork la clase B tiene un objeto de la clase A entre sus variables entonces en el main podrias imprimir el mensajito de la clase A usando metodos de la clase B y la A. ejemplito piblic class ClaseA{ public void imprimirmensaje(){ System.out.println("Hola"); } } public class ClaseB { private claseA var1; public ClaseB() { //constructor vacio ya que la claseA no tiene ningun dato al que darle valor } public claseA getVar1() {// metodo que te devuelve el objeto ClaseA tal cual (conocido como getter) return var1; } } public static void main(String[] args){ ClaseB var2= new ClaseB();// creo el objeto de la clase B y lo instancio var2.getVar1().imprimirmensaje(); // aqui solo estas pidiendole a la claseB que te de el objeto claseA que el tiene y despues como ya tienes el objeto claseA le dices que imprima el mensaje llamando al metodo d ela clase A el hace lo mismo pero con metodos mas que hacen otras cosas mas avanzadas que esto.Y estos epuede llevar al extremo de llamar a metodos dentro de metodos y asi infinitas veces xD }
Sí, es una de las cosas que varían dependiendo del sistema operativo. Estoy seguro de que habrá forma de sacar el beep con mint, pero desconozco la forma. Un saludo!!
Hola Heyner, En Ubuntu y derivados, por defecto, está desactivado el beep del sistema. De hecho, yo he conseguido sacarlo a través de Runtime en lugar de Toolkit. Primero tenemos que asegurarnos que podemos ejecutar un beep en el sistema: 1.- Instalamos el paquete beep. Para ello abrimos un terminal (ctrl + alt + T) y ejecutamos: sudo apt install beep 2.- A continuación tenemos que cargar el módulo pcspkr. Para ello introducimos en el terminal: sudo modprobe pcspkr 3.- Comprobamos que ya tenemos activado el beep del sistema. En el terminal tecleamos: beep Si todo ha funcionado correctamente (deberíamos escuchar un beep después de teclear la instrucción), tenemos que modificar el archivo blacklist.conf para que se cargue el módulo pcspkr cada vez que se inicie el sistema: 1.- Desde el terminal tecleamos: sudo gedit /etc/modprobe.d/blacklist.conf 2.- En el archivo que se abre, buscamos la línea que pone blacklis pcspkr y la comentamos poniendo almohadilla delante (#). Debería quedar algo parecido a esto: # ugly and loud noise, getting on everyone's nerves; this should be done by a # nice pulseaudio bing (Ubuntu: #77010) # blacklist pcspkr 3.- Guardamos cambios (ctrl + S) y cerramos. Finalmente, para que el beep funcione en la aplicación Java que estamos desarrollando, tenemos que utilizar la clase Runtime en lugar de Toolkit. Las líneas de código que sustituyen a Toolkit, quedarían: try { Runtime.getRuntime().exec("beep"); } catch (IOException ex) { ex.printStackTrace(); } Runtime es una clase que permite interactuar con el sistema dónde está corriendo la aplicación Java. De hecho, cada vez que corremos una aplicación Java, se crea una instancia de esta clase. Con la instrucción getRuntime(), lo que estamos haciendo es llamar a la instancia Runtime actual y con el método exec(String s), ordenamos al sistema que ejecute el comando que le hemos pasado como String (equivaldría a abrir un terminal y ejecutar el comando beep).
Entendí lo de las clases internas, pero mi duda viene sobre cuando usas el método beep. La cosa es que andaba mirando el método beep y me doy cuenta con que es abstracto y me llega la duda: ¿Cómo lo uso?, me acuerdo de el tema de las clases abstractas y me acordé en especifico que cuando una clase hereda de otra que es abstracta se tiene que cumplir todos los métodos; pero tú solo utilizaste el método beep, y esto no es una clase y me doy cuenta de que usas la siguiente instrucción: Toolkit.getDefaultToolkit().beep(); y me doy cuenta de que cuando pones Toolkit.getDefaultToolkit() pones otro método y eso me causó confusión pero creo que tengo la respuesta. Creo que se aplica algo similar a lo de las clases abstractas, en específico lo de que cuando una clase hereda de una clase abstracta esta tiene que sobrescribir sus métodos, y creo que en la parte después de getDefaultToolkit cuando pones el otro método el método beep hereda de getDefaultToolkit. Pero la pregunta de el millón ¿ cuándo veo una clase en la api de java que tenga algo así: public abstract void beep (), cómo la utilizo? Sé que es difícil responder a tantos comentarios y darnos "Píldoras informáticas" todos los días; pero aprovecho para darte las gracias a tus excelentes videos. PD: Creo que voy a terminar con sobredosis de "Píldoras informáticas" xD
Manuelito jajajajajaja tómate un descanso. Debes utilizar el método como otro cualquiera. Que sea abstracto indica que está sin implementar (solo declarado) y que obligatoriamente la clase a la que pertenece (en este caso Toolkit) es obligatoriamente abstracta. getDefaultToolkit nos devuelve un objeto Toolkit. ¿Qué es un objeto Toolkit? El sistema de ventanas donde se está ejecutando la aplicación. Lo que hace es obtener tu objeto Toolkit gracias a getDefaultToolkit y aplicar después sobre él un beep (sonido) Saludos
+Manuelito Creo que la clase que hizo (PruebaTemporizador2) no implemento o heredo de la clase toolkit solo utilizo el metodo beep( ) por eso no tuvo que cumplir como dices con los otros metodos. Creo yo que por ahi va la duda.
HOLA añado una corrección que me surgio quizas sea por la version actual de java por que todo el código es = como lo dijo el profesor salvo que al momento de escribir la clase DameLaHora e instanciar la misma me pide que la clase si o si sea static si no no me deja dejo el codigo a continuación al programa lo estoy corriendo con INTELLIJ package poo; import javax.swing.*; import javax.swing.Timer; import java.awt.event.*; import java.util.*; public class Prueba_temporizador { public static void main(String[] args) { DameLaHora oyente = new DameLaHora(); //ActionListener oyente = new DameLaHora; Timer miTemporizador = new Timer(5000,oyente); miTemporizador.start(); JOptionPane.showMessageDialog(null,"pulsa aceptar para detener"); System.exit(0); } static class DameLaHora implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { Date ahora = new Date(); System.out.println("Te pongo la hora cada 5 segundos: " + ahora); } } }
Hola que tal!!! Pregunta si aquí estamos agregando la Clase Abstracta Toolkit por que no se hizo un extends a la Clase DamelaHora2() y por que no se agregaron todos los métodos abstractos pertenecientes a la Clase Abstracta Toolkit, aquí solo agregaste Toolkit.GetDefaultToolkit.beep()
Carlos Hernandez Hola !! Hace tiempo que grabé este vídeo y no recuerdo exactamente qué comenté en él. Tendría que verlo entero a no ser que me digas el minuto y segundo exacto donde surge tu duda. Pero creo recordar que aquí no heredamos de la clase Toolkit. Si lo hiciéramos, entonces sí tendríamos que sobreescribir todos los métodos de la clase abstracta Toolkit que no son pocos. En el ejemplo creo recordar que nos limitamos a usar la clase Toolkit con la instrucción Toolkit.GetDefaultToolkit.beep(), que para eso están en la API, para utilizarlos. Un saludo.
pildorasinformaticas A OK entonces lo que entiendo es que al ser una clase abstracta Toolkit si lo que requiero es ocupar alguno de sus métodos de esta, no necesariamente tengo que extenderla solo tengo que importar la Clase Toolkit a mi clase y llamarla como en tu ejemplo a Toolkit.GetDefaultToolkit.beep(). Esto es correcto?
Debes importar el paquete. pero no porque sea abstracta, sino porque esto hay que hacerlo siempre que quieras utilizar una clase que no pertenezca al paquete java.lang No te confundas con lo siguiente: una cosa es utilizar una clase y otra cosa diferente es heredar de una clase. Si heredas una clase abstracta estás obligado a sobreescribir todos los métodos de la clase, pero si solo la utilizas, no estás obligado a sobreescribir los métodos. un saludo
Alguien quien sea tan amable de explicarme, por qué la función actionPerformed(ActionEvent evento) de la clase interna DameLaHora2 se ejecuta, si nunca llamamos a ese método en el código? Porque entiendo todo menos eso :(
A ver si sé responderte: Timer necesita un "oyente" y este oyente es una "instancia de interfaz" tipo ActionListener creada mediante la clase Damelahora2, ya que no se puede instanciar una interfaz directamente. Es la clase Timer la que hace uso interno del método "actionPerformed" perteneciente al objeto oyente
Era sobre implementar ActionListener, pensé que en este caso no íbamos a hacerlo y no entendía por qué, tuve que dejar el vídeo a medias y por eso no llegué a ver que si lo haríamos. Fallo mío soy un impaciente jajaja
adjunto codigo con comentarios para el que le sirva.... Gracias por la enseñanza Juan package v52_v53_interfaces_clases_internas_temporizador; import java.awt.Toolkit; import java.awt.event.*; //para la interfaz import javax.swing.Timer; // para el la clase Timer. CONSTRUIMOS un timer que usa 2 parámetros de tipo tiempo en milise //segundos y una interfaz listener. //no se importó con * porque java.util tambien tiene una clase timer que es para otras cosas //sale error si no se dice cual
import java.util.*; //para el Date import javax.swing.JOptionPane; //para el JOptionPane //v53 uso de clase Toolkit que hace una especie de puente entre los recursos del SO y nuestro programa import java.awt.Toolkit; public class Temporizador {
public static void main (String[] args){
//creamos una instancia de la clase Reloj, mi_reloj con los parametros del constructor
Reloj mi_reloj = new Reloj (5000, true); //cada 5 segundos con sonido en true
//llamamos al metodo set que consifguró la manera de hacer arrancar el reloj
mi_reloj.set_temporizador(); //el objeto ejemplar de clase mi reloj y el METODO de la clase Reloj
//necesitamos mantener el programa en ejecución hasta que querramos con una ventana de JOptionPane.showMessageDialog
JOptionPane.showMessageDialog(null, "Pulsa Aceptar para Detener"); //el timer se ejecuta hasta que le demos aceptar //luego se pasa a System.exit(0); y sale
System.exit(0); //hace que el programa se detenga, luego de pulsar aceptar, ya que el codigo baja y lo lee
}
}
// Creación de la clase Reloj para hacer clase sobre clase
class Reloj {
//declaramos variables private
private int intervalo; //aqui se almacenan los 5000 milisegundos
private boolean sonido; //aqui se almacena el true
//creamos el constructor
public Reloj (int intervalo, boolean sonido ) {
this.intervalo = intervalo;
this.sonido = sonido;
}
//creamos un METODO set para configurar el temporizador
public void set_temporizador(){
ActionListener listener = new Dame_Hora2(); //instancia de un objeto ActionListener, interfaz, con el constructor de clase //dame_hora2, la cual será INTERNA DE LA CLASE RELOJ, //SE CONSTRUYE DE ULTIMO
Timer temporizador = new Timer (intervalo, listener); //instancia del objeto temporizador de la clase Timer //con los parametros del intervalo de tiempo y //el objeto de la clase interfaz ActionListener
temporizador.start(); // para que arranque
}
//creacion de la clase interna Dame_Hora2 dentro de la clase Reloj
private class Dame_Hora2 implements ActionListener{ //implementa la intefaz ActionListener
//creamos el metodo exigido por la interfaz ActionListener que es actionPerformed (ActionEvent e)
public void actionPerformed(ActionEvent e) {
Date tiempo_actual = new Date(); //objeto tipo fecha, tiempo_actual
System.out.println ("La hora actual es cada 7 segundos :" + tiempo_actual);
//configuramos el BOOLEAN SONIDO
if (sonido = true) { //la ventaja de la clase interna es acceder a los campos del ejemplar que la contiene //en este caso accede a la variable de clase sonido que está fuera de ella pero //pertenece a su clase padre contenedora. ahorramos crear set o get para usar esas //variables private
//usamos la herramienta del SO que nos saca el sonido del SO.beep
✅✅ ✅ ✅ ✅ Todos mis cursos gratuitos 👉 www.pildorasinformaticas.es ✅✅ ✅ ✅ ✅
🚀 ¿Quieres ejercicios? ¿Quieres más temario? 👉 www.pildorasinformaticas.es/course/java-tutorizado/🚀
🚀 ¿Quieres que te resuelva las dudas de Java? 👉 www.pildorasinformaticas.es/course/java-tutorizado/ 🚀
💥💥💥 Siempre seguiré subiendo cursos gratuitos por aquí. Gracias a todos por seguirme. 💥💥💥
genial naciste para enseñar tienes un don de verdad felicidades
Gracias !! Un saludo.
Excelente explicación, voy algo atrasado con los vídeos pero espero que el contenido de este curso java siga aumentando. Gracias por hacer estos vídeos.
Gracias a ti por seguirlos. Me alegro de que te gusten. Un saludo!!
Años siguiéndolo ,con usted aprendí y aprendo aún mucho ,un grande.
Saludos desde Colombia.
Me he incorporado tarde pero voy avanzando. El curso extraordinario. Muchas gracias. De vez en cuando, repito algún video ya pasado para reforzar.
+Carlos Jorge De Moganda Gracias por el comentario. me alegro de que te gusten. Repetir vídeo es inevitable con algunos conceptos. Un saludo!!
Yo en el 2021 :'C
@@dearalex2056 Yo en 2023 XD
@@kevinjimenez6143 yo en Febrero 2024.🙂
Hola a todos.Como siempre doy las gracias a Juan por exelente curso.En relacion a
patrones de diseño,tambien me parece aspecto muy importante.Yo,que soy autodidacta,tengo ese problema.Al intentar hacer el programa propio(reloj por ejemplo),
no tengo ni idea de que empezar,no tengo orden predeterminado.
De momento tengo una idea y hago lo siguiente.Intento comentar programas hechas por Juan en los videos(una especie de pseudocodigo).Eso me ayuda entender mejor funcionamiento del programa.Aqui le cuelgo ejemplo del video 53 :temporizador.
Disculpad por fallos y si alquien quiere colgar su vercion de pseudocodigo seria interesante analisarlo.Saludos a todos
/*este programa muestra hora actual cada 3 segundos acompañandolo con un beep.
*para eso creamos un objeto miReloj y le pasamos como parametros(intervalo de ejecucion y sonido)
*antes creamos una clase Reloj donde declaramos variables:int intervalo y boolean sonido.El constructor tendra esos parametros:intervalo y sonido
*En esa misma clase declaramos y definimos un metodo enMarcha() para poner en marcha nuestro objeto miReloj.
*para eso dentro del metodo tenemos que crear objeto temporizador de clase Timer que va a encargar a arrancar nuestro programa
*para instanciar objeto de clase timer necesitamos 2 parametros(intervalo de ejecucion de tipo int e un objeto de tipo actionListener)
*con el metodo start() arrancamos temporizador
*como uno de los parametros para crear temporizador es de tipo ActionListener creamos clase DameLaHora la que implementamos con interfaz AccionListener
*y por regla esa clase implementa el metodo de interfaz (public void actionPerformed(ActionEvent evento).
*dentro del metodo se describe el evento:1.creamos objeto de tipo Date que nos muestra hora actual 2.ponemos mensaje que queremos mostrar y hora
*3.con merodo beet()declase Toolkit asignamos sonido al evento.
*En clase main instanciamos objeto miReloj de clase Reloj con parametros(intervalo,true) y lo arrancamos con metodo enMarcha
*para que el programa no muera en instante creamos una ventana donde escribimos "Pulse Aceptar para terminar"
*para ese fin usamos metodo showMessageDialog de clase JOptionPane con parametros(null,mensaje a mostrar).
*Con ayuda del metodo exit() de clase System(parametro 0)salimos del programa.
*/
package poo29;
import javax.swing.*; //contiene clase JOptionPane
import java.awt.event.*; //contiene interfaz ActionListener
import java.util.*; //contiene clase Date
import javax.swing.Timer; // importamos clase Timer para evitar confusion(hay varios clases Timer pertenecientes a diferentes paquetes)
import java.awt.Toolkit; // importamos clase Toolkit de paquete java.awt
public class PruebaTemporizador2 {
public static void main(String[] args) {
Reloj miReloj=new Reloj(3000,true);
miReloj.enMarcha(); // ponemos en marcha reloj usando el metodo enMarcha
JOptionPane.showMessageDialog(null,"Pulse Aceptar para terminar"); //para que programa no pare antes de tiempo
System.exit(0); //instruccion de salir de programa
}
}
class Reloj{
public Reloj(int intervalo,boolean sonido){
this.intervalo=intervalo;
this.sonido=sonido;
}
public void enMarcha(){
ActionListener oyente=new DameLaHora2();
Timer temporizador=new Timer(intervalo,oyente); //elaboramos temporizador
temporizador.start(); //arrancamos temporizador
}
private int intervalo;
private boolean sonido;
private class DameLaHora2 implements ActionListener{ //clase interna
@Override
public void actionPerformed(ActionEvent evento) {
Date ahora=new Date();
System.out.println("Te doy la hora cada 3 segundos"+ahora);
if(sonido==true){
Toolkit.getDefaultToolkit().beep();
}
} //fin de clase interna
}
}
Excelente ejemplo se entiende el concepto de las clases internas.
Eres un Dios de la enseñanza
Tremendo beep, he saltado del susto xD
Excelente explicación y ejemplo, todo un maestro, muchas gracias Juan, saludos desde México. :)
Excelente profesor, lo sigo desde hace años y la verdad no deja de sorprenderme en sus videos, solo me resta decirle gracias !!
Genialmente explicado como siempre, lástima que a estas alturas de curso no se me acaba de meter en la cabeza la POO y me cueste mucho adivinar/crear el código que tu después escribes.
7:30 BRUJERIA, ESTO ES BRUJERIA, JAVA ES DEMASIADO PODEROSO
jajajaja yo tambien me quedé así, qué grandioso :)
Eres un grande!
Qué maravilla de vídeo
Gracias profe! es un lio barbaro jeje, pero sigo adelante =)
Grande Juan!!! indiscutiblemente tienes un don para la pedadogia que no es facil y mas aun por videos.
Consulta para quien pueda responderme, saben donde puedo practicar? hay alguna pagina donde me permita ejercitar todo los visto hasta ahora?
"En la cuidad de mi corazón, le haré una estatua en el barrio de la programación" Xd!!! :v
Ehh poeta!
.
.
calmate romeo que vas a poner a Turing cachondo
Le voy a crear un altar, lleno de veladoras, increíble no puedo creer lo mucho que he aprendido, muchísimas gracias
En el caso de Linux MInt no reproduce sonido pero eso se debe a las preferencias de sonido al saltar una ventana de advertencia, emergencia, error etc, solo es cuestión de colocar sonido en esa parte, me imagino que los usuarios de escritorio plasma (KDE) les dará un sonido por default, interesante seria poder colocar un sonido propio que uno desee y no el del sistema operativo.
Juan Juan eres el number one one
hay algo que me confunde en la clase reloj en el metodo constructor @CARMEN BÁEZ CARACOL coloca el parametro sonido como final, sin embargo funciona aunque cambie el valor
Tengo una pregunta, porque si coloco la instrucción del metodo Toolkit.getDefaultToolkit().beep(); En el main no me emite el sonido a diferencia que colocándolo dentro del metodo public void actionPerformed(ActionEvent e) {}?
Hola. Gracias por todo el conocimiento transmitido. Las retrollamadas mencionadas en 3:39 ¿en que vídeo del curso se pueden estudiar?
A mí tampoco me funcionaba el beep con windows 10. Era porque tenía desactivados los sonidos del sistema. Me fuí a sonido y en la pestaña sonidos activé en combinación de sonidos, predeterminado de windows.
En linux mint el Toolkit no me emite ningún sonido. No se si será por alguna configuración mía o es por Java. Ya lo investigaré. Lo comento por si a alguien también le ocurre.
+Bart Clavero Ibarra me ha sucedido lo mismo, ya sabes la respuesta?
Todavía no pero me imagino que la cosa tendrá que ver con el driver de sonido que tengamos seleccionado en linux. Hay dos tipos de drivers para audio en linux, Alsa y Pulse.
+Bart Clavero Ibarra Ahora tengo curiosidad, sigues teniendo el mismo problema??
+Bart Clavero Ibarra Ubuntu y me pasa lo mismo.
A mi tampoco me reproduce ningún sonido, uso mint y tengo los sonidos activados en la configuración :( Alguien tiene alguna solución?
Buenos días, consulta. Tiene curso de spring boot?
Hola Juan, me gustaría preguntarte si sabes de alguna web o libro donde se hable de patrones de diseño. Por que me parece que es importante tener un buen diseño antes de tratar implementar nada ¿no?. ¿O vas a explicarlo más adelante? Gracias por todo. A ver si llegamos a hacer todo el curso.
Paul Cano Voy a explicarlo más adelante. Como es un curso que comienza desde 0 (pensado para gente que no sabe programar en ningún lenguaje) en mi humilde opinión hablar de patrones antes de ponernos a programar no es muy estimulante. Pero lo veremos. En cuanto a libros que hablen de ello, la verdad no conozco ninguno. Yo de patrones solo tengo apuntes de universidad. Un saludo
Yo tampoco es que sepa mucho. En la universidad, lo máximo que hice fue un Busca Minas. Pero recuerdo que mi profesor nos aconsejaba que no estaba demás saberse Patrones de diseño en un futuro. Si lo vas a explicar más adelante, estupendo. Muchas gracias por contestar. Un saludo.
Una pregunta ¿ Por qué no se puede llamar el método beep() directamente ? Por ejemplo : ToolKit.Beep() .
Tengo 1100 vídeos en el canal (me resulta imposible acordarme del código). Pruébalo y si funciona, perfecto. En programación "siempre hay varios caminos que te llevan a Roma" y yo no tomo siempre el más corto. Un saludo!
@@pildorasinformaticas Ok, mucha gracias por tomarte el tiempo de responder. Saludos.
Hola Juan queria preguntale lo siguiente: cuando escribo la siguiente instrucción import javax.swing.Timer; a los efectos de evitar el conflicto. eclipse me dice que Timer no es accesible debido a una restriccion en la libreria , le pregunto como podría solucionar este problema
Mira a ver si se trata de el mismo error que comenta este compañero (pero con la librería Timer). Pincha aquí: www.pildorasinformaticas.com/archivos/java/JOptionPane_problema.jpg
Un salduo!
Muchas Gracias Juan. Ojala y podamos conocernos cuando visite a mi hijo que está viviendo en Madrid. Un Abrazo
Hola juan, sigo tu curso de java java desde el primer video y hasta este punto tenia actividades para practicar por mi cuenta ya que estoy haciendo un modulo superior de Desarroyo Aplicaciones Web. El caso es que no profundizan tanto java y yo quiero aprender mas y se que haciendo actividades que te planteen un problemas te ayuda a aprender. El caso es que queria preguntarte si sabes de alguna paguina donde me pueda descargar actividades para reforzar lo aprendido.
enhorabuena por el canal me ha ayudado un monton!!
gracias por la clase
hola profesor... desde ya gracias nuevamente...lo único que no me quedo bien claro es cuando elegir crear clases internas o crear métodos de acceso setters y getters ... espero ver la luz pronto!
Poco a poco... Una clase interna la crearás cuando tengas dos clases que tengan una estrecha relación entre sus métodos y sus campos. En este escenario casi siempre necesitamos que los métodos de una clase y otra puedan acceder a los campos de cada una de las clases. También decirte que la mayoría de las veces hay alternativas a la hora de crear el programa para prescindir de las clases internas, pero el código se complica y alarga. En este sentido las clases internas vinieron para simplificar el código. Un saludo!!
gracias-!!!
Salto un error en:
private class DameLaHora2 implements ActionListener{
public void actionPerformed(ActionEvent evento){}
pero se soluciona importando:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
Me pasó igual y eso que había importado el paquete awt completo
Buen ejemplo. Gracias
cambiaría algo si le quitamos el private a las clases internas?
Pregunta... vengo siguiendo el tutorial desde el inicio. Porque no generas los metodos setters y getters de manera automatica mediante el source??
Sebas Casca Hola !! Porque no es un curso de IDE sino de Java. Es muy posible que haya gente desarrollando con bloc de notas. Un saludo
Buen dia profe! le hago una consulta muy basica... en todos los programas que creamos anteriormente la instrucción system.out.printl se encontraba en el metodo Main, sin embargo en este caso, se encuentra dentro de la clase (o mas bien del método). Mi pregunta es porqué lo programamos esta sentencia de esta manera? Gracias y saludos!
Hola !! La instrucción de imprimir en consola (System.out.println) puede ir colocada donde quieras o donde lo necesites. No es obligatorio que vaya siempre en el main. El método main, tal y como se explica en el curso, es el método desde el que se inician todas las aplicaciones de Java (casi todas). Como aún vas por el vídeo 35 y estás en los comienzos, todos los programas que se han hecho hasta este punto son extremadamente sencillos y no tienen casi métodos aparte del main. Observarás, a medida que avances en el curso, como los programas pueden tener multitud de métodos y clases y colocarás en cada uno de ellos lo que necesites.
Un saludo!!
Gracias Profe, ahora si entendi. Voy de a poco. Llegare hasta el final! todos los dias estoy de 4 a 5 horas mirando sus videos, practicando en Eclipse... Gracias infinitas!!!!!
Hola buenas! Tengo una pregunta que quizás sea absurda, puede que esté despistado pero, ¿por qué en este segundo ejemplo no hemos necesitado implementar actionListener?
pero si esta implementado! es la clase damehora2
y si creas una clase interna dentro de la clase interna DameLaHora2 seguiría pudiendo acceder a las variables sonido e intervalo? o habría que crear los correspondientes getters?
Una duda, al momento de instanciar la clase Reloj, también se estaría instanciando la clase DameLaHora2?
No recuerdo ya el código de este vídeo (hace tiempo que lo hice) pero no. Que la clase sea interna no implica que se esté instanciando por instanciar la clase que la envuelve. Un saludo!
y me sale este error
The type Reloj.DameLaHora2 must implement the inherited abstract method
ActionListener.actionPerformed(ActionEvent)
También me salía ese error, lo solucioné aplicando la sugerencia de Eclipse de crear el método que aparece allí para después borrarlo, luego me señaló que había una llave de más.
Profe no entiendo la sintaxis de la instrucción Toolkit.getDefaultToolkit().beep(); Entiendo que está utilizando el método estático de toolkit llamado getdefault y creo yo que hasta ahí da como resultado el sonido por defecto del sistema operativo y luego se reproduce con el método beep. No sé si estoy equivocado, Java permite ejecutar 2 métodos de esa manera?
Hola !! Sí, Java permite este tipo de encadenamiento de métodos al igual que ocurre con otros lenguajes. El método que reproduce el sonido es beep(). getDefaultToolkit lo que hace es obtener los diferentes componentes nativos del sistema operativo, entre ellos el sonido. O sea, que estás bien encaminado con lo que dices. Un saludo!!
Hola. Cuando añado la sentencia para hacer sonar el "beep" con cada refresco del contador, la ventana del JOptionPane me parpadea medio segundo. Concretamente, en ese medio segundo pasa a verse en el modo oscuro en el que tengo configurado el Windows 10. El IDE que utilizo es el Eclipse. ¿A alguien más le pasó algo parecido y tiene idea de cuál es el motivo? Gracias.
buen dia prof. Juan, estoy realizando este curso, y hasta ahora todo muy bien, pero en esta leccion y la anterior me da un error, a pesar que he copiado las lineas identicas a como ud las tiene... eso con la finalidad de verificar si la forma como yo la habia hecho estaba mal... mi pregunta con que eclipse trabaja ud y la version, yo baje el eclipse Mars Release (4.5.2)
prueba importando la clase java.awt.Toolkit
De que manera puedo hacer que suene un sonido personalizado?
hola juan, tengo una duda desde muy atras y es con los paquetes, he seguido el curso con netbeans y todo bien pero para cada practica tengo que crear nuevos proyectos, por que si creo una nueva clase y aunque este en paquete distinto y ejecuto el programa en el play solo se me ejecuta un solo main, por ejemplo en la practica temporizador me salio bien pero cree una nueva clase en paquete distinto y la llame temporizador2 y cuando ejecuto lo que sucede es que se ejecuta el main de temporizador osea el primer ejemplo que creamos
Cuando creas una clase en un paquete distinto ¿importas la clase en los otros paquetes para poder utilizarla?
no, no la importo, solo la creo y listo, me dijeron en un foro que en netbeans hay que crear proyectos nuevos cada ves que vay a realizar una practica diferente, pero no se si sera cierto, y tengo un recuerdo de hace mucho que vi que alguien cambiaba desde netbeans que cambiaba la clase que se ejecutabab, creo que debe ser una diferencia entre netbeans y eclipse, me intirga
hola, me podria ayuudar como validar que solo ingrese letras.
+juan baque Hola !! Echa un vistazo en la API a la clase StringUtils. esta clase tiene un método static isNumeric, que evalúa si un String es numérico o no
Muchas gracias
Buenas noches, Juan, no me explico porque no me suena, si lo he hecho igual que tu, no tengo desactivado el sonido, ni nada de eso, funcionan correctamente, pero no consigo hacer que suene cada vez que enseña la hora por pantalla. Qué podría ser?. gracias.-
Algún fallo que no ves (suele ocurrir) o que el beep de tu ordenador no funciona. Puedes copiar y pegar todo tu código por aquí para que yo u otra persona podamos comprobar si hay errores. Un saludo!
@@pildorasinformaticas
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
import java.awt.Toolkit;
public class PruevaTemporizador2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Reloj mireloj=new Reloj ();
mireloj.enMarcha(3000,true);
JOptionPane.showMessageDialog(null, "Pulsa la Tecla para Terminar");
System.exit(0);
}
}
class Reloj{
public void enMarcha(int intervalo, final boolean sonido){
class DamelaHora2 implements ActionListener{
public void actionPerformed(ActionEvent evento){
Date ahora= new Date();
System.out.println("Te pongo la hora cada 3 sg.: "+ ahora);
if(sonido){
Toolkit.getDefaultToolkit().beep();
}
}
}
ActionListener oyente=new DamelaHora2();
Timer mitemporizador=new Timer(intervalo,oyente);
mitemporizador.start();
}
}
@@carmen7598. Saludos. Primeramente comentar que esta estructura de código creo que pertenece a un vídeo posterior (aunque no estoy seguro lo comento por si alguien trató de interpretar infructuosamente las líneas de código comparándolas con las del vídeo).
En segundo lugar, he probado el código que ha dejado escrito y los pitidos se emiten correctamente, en mi caso, una máquina Ubuntu 18.04. Siendo que el código no presenta problemas en la consecución de los fines requeridos para este vídeo, no sería arriesgado pensar que el problema tenga que ver con la configuración (no sé cuál) de su equipo.
@@antoniol.9340 hay algo que me confunde en la clase reloj en el metodo constructor Carmen coloca el parametro sonido como final, sin embargo funciona aunque cambie el valor
@@carmen7598 Hola, buenas tardes,
Igual ya pasó mucho tiempo, copié tu código tal cual esta en tu comentario, lo pegué en mi PC y si me emite sonido. Debe ser, como comenta el profesor Juan, un problema con el sonido de tu equipo. Que tengas un excelente día.
Saludos,
Eso, es como si fueran clases heredadas?
Una pregunta fuera de contexto cuando implementamos una interfaz Jefes por decirlo asi y esta extiende de Trabajador es obligatorio que mi clase que implementa jefes lleve tambien los metodos abstractos de la interfaz trabajador o solo de la misma jefes, Saludos Ingeniero y un agradecimiento por sus cursos de antemano!
¿Podriamos decir que con las clases internas también estamos heredando? Porque igual así, podemos hacer herencia “múltiple” de forma enmascarada, ya que, la clase interna no tiene que extender pero podríamos extender de otra clase externa a la clase interna. ¿Se podría?
un objeto de la clase interna no podría usar los métodos de la clase que la contiene, pero sí los atributos
@@aaronmaiden3606 ok , muchas gracias.
Dejo un pequeño aporte para los que usan linux y no les suene el sonido.
Tienen que poner a correr el modulo pcspkr
Con el siguiente comando:
sudo modprobe pcspkr
Solo lo probre en distros basadas en ubuntu asi que no se si sirva en otras distros.
yo uso linux y me ha funcionado a la primera
gracias por los tutos he quiero preguntarle la clase DameLaHora eclipse me la marca como error y no he podido ejecutar el codigo.espero su respusta, gracias...
Si no me enseñas tu código imposible que te de mi respuesta. Copia y pega por aquí todo tu código para ver cuál es el error. Un saludo!!
quite el System.exit(0): e igual me cerro el programa al pulsar el boton del message dialog. para que es System.exit? realmente se necesita en este ejercicio?
+jerry ponce No recuerdo el código de este vídeo, pero si lo quitas y funciona igual no hará falta entonces. System.exit(0) hace que el flujo de ejecución salga del programa. Un saludo!!
Gracias por la respuesta. Y Gracias por la ayuda que das con tus videos
+jerry ponce Sin el System.exit(0) no se a ti pero a mi me tarda como 1 segundo o 2 en acabar la ejecución con lo que ese segundo o dos cuenta para el total de tiempo que ha estado el programa en ejecución.
mmm! interesante lo que dices, en el mio no note mucho tiempo en cerrarse sin el system.exit pero lo voy a hacer con ambos para checar la diferencia, Gracias.
Buen Día Juan, me surge una inquietud, ¿por que una clase interna No static no puede crear métodos staticos únicamente solo cuando la clase interna sea static? gracias :)
Me vas a disculpar pero no entiendo la pregunta. Intenta formularla de otra forma. Un saludo
Muchas gracias
7/11/24 19:35
Mi estimado amigo, primero para felicitarte por el exelente trabajo que estas realizando, y con otra inquietud trabajo con Netbeans en un sistema Windows 8.1 y la novedad que tengo es que no me suena el pitido, he buscado en foros y no encuentro la solucion, sabes cual podria ser el problema? sigo al pie todos tus videos, un Saludo.
Pues no tengo idea la verdad. Debería de sonar sin problemas... Es raro.
tengo 8.1 y estamos iguales :'( pero porlomeno eso es solo en 8.1 y ya sabemos como hacer el codigo gracias a Juan
Tengo windows 8.1 y si reproduce el sonido... obviamente no es el mismo al del video
Hola Juan,
tengo todo el código implementado correctamente pero la sentencia Toolkit.getDefaultToolkit().beep() no reproduce ningún sonido. He estado inspeccionando mis ajustes de sonido y no veo nada extraño. Tengo Windows10.
Un saludo y muchas gracias por tus vídeos, de verdad. Son excelentes!
Gracias por el comentario. Pues la verdad no sabría decirte dónde puede estar el origen del problema... Siento no ser de más ayuda en esta ocasión. Un saludo!!
No te preocupes, seguiré investigando. Muchas gracias por todo!
No me sonaba nada pero al desconectar el HDMI del televisor y al probarlo nuevamente solo en el computador ya me aparece el sonido.
Hola juan fijate que tengo igual el codigo y no me sale ningun sonido porque sera? gracias :)
+sakakibara sarot Ni idea.... puedes copiar y pegar tu código por aquí para que lo pueda comprobar. Un saludo
+sakakibara sarot Igual tienes los sonidos de Windows deshabilitados. Suponiendo que trabajes con Windows.
Es curioso pero el beep no suena ejecutando en Netbeans en un Linux MInt 17 KDE.
Mañana haré la prueba en Windows pero seguramente si funcione.
Después de 10 años sigue igual. Sin sonar el beep en Linux mint
Buenas tardes
No he podido descubrir por que me da un error
public void enMarcha() {
ActionListener oyente = new DameLaHora();
Timer miTemporizador = new Timer(intervalo, oyente);
miTemporizador.start();
}
el error me sale en new Timer(intervalo, oyente); y me dice que el constructor es undefined
lo tengo tal cual lo tienes tu solo cambio el nombre del paquete ya que los estoy separando del resto de ejemplos.
gracias por tu ayuda
fijate si importaste bien los paquetes java.
Tengo el costumbre de declarar los atributos justo después de la clase a la que pertenecen.
En éste caso me marca un error y no entiendo el motivo...
holaaa, me pueden ayudar tengo esta duda desde el vídeo 52,53,54 estamos trabajando con una interfaz predefina ActionListener(); la cual nos obliga a incluir el método ActionPerformed(ActionEvent) que recibe un parámetro llamado ActionEvent, entonces mi pregunta es:
que papel juega el parámetro de ese método? si a la final cuando lo usamos no le pasamos nada al parámetro, eso se puede hacer?? o es que todavía no entiendo después de tres vídeos :s :s ayuda plis..
Hola ese parametro queda en oyente.
me recuerda a los Closure en el mundo javascript
Hola, tengo un problema con el código, el OS que estoy usando es Windows 10 y el beep no se reproduce. Tienen idea de que podrá ser? Ya revise la configuración de windows y los sonidos están activados. Desde ya, gracias por la ayuda.
Dejo el cod:
package poo;
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
public class prueba_temporizador {
public static void main(String[] args) {
// TODO Auto-generated method stub
damelahora oyente=new damelahora();
Timer mi_temporizador=new Timer(5000,oyente);
mi_temporizador.start();
JOptionPane.showMessageDialog(null, "pulsa aceptar para detener");
System.exit(0);
Toolkit.getDefaultToolkit().beep();
}
}
class damelahora implements ActionListener{
public void actionPerformed(ActionEvent e){
Date ahora=new Date();
System.out.println("Te pongo la hora cada 5 segundos" + ahora);
}
}
Saludos!
Hola !! Debes poner la instrucción del sonido dentro del método actionPerformed para que responda a evento. Tú la tienes en el main. Un saludo!!
Me sucede algo curioso con la interfaz ActionListener porque en el ejemplo anterior no me daba error cuando lo ejecutaba pero ahora si y importe import java.awt.event.ActionEvent; import java.awt.event.ActionListener; y se me quitó el error, no entiendo por qué ahora si me da error y antes no! Es confuso!
+Astrid Bompart Si posteas el codigo en el mensaje ayudaria mucho, aunque es muy probable que sea un error de sintaxis, en error de compilacion en el IDE te puede aparecer un mensaje que te da una idea del error que esta ocurriendo.
+Astrid Bompart A mi me pasaba lo mismo, el error era que habia escrito: import java.awt.Event.*; que te lo importa java si le das enter cuando te salen las sugerencias, y el que debes importar es java.awt.event.*; que no es lo mismo.
+DIego Asekas Eso era lo que estaba pasando!! Gracias por aclarar la duda!!! :)
UNA CONSULTA PILDORASINFORMATICAS, TU COMO TE DISTE CUENTA QUE TENIAS QUE USAR PRIMERO EL METODO getDefaultToolkit() Y RECIEN AHI LLAMAR AL METODO beep() SI AL TRADUCIR TODO NO TE DICEN QUE PARA USAR EL BEEP() ANTES SE TIENE Q USAR EL GETDEFAULTTOOLKIT() ???? EXPLICAAA !!!
alguien sabe donde puedo leer mas sobre este tipo de metodos?:
Toolkit.getdefaulttoolkit().beep();
me refiero al tema de que colocamos un . y otro metodo despues de haber usado un metodo
Hola.
He intentado descubrir por mi cuenta como implementaste la linea de codigo donde se usa beep(); , sin embargo, quize tambien saber como es que se usa el JOptionPane.showInputMessage(); , porque creo es algo similar, y al intentar entender por mi cuenta desde la documentacion de la API de java, no encuentro solucion concreta. Si he visto todos los videos del curso anterior a este, y me es muy dficil entender la diferencia entre extender de una clase abstracta, a solo implementar los metodos que tiene.
Tambien no entiendo el porque poner Toolkit antes del metodo, ya que no es static, ademas, eso de encadenar los metodos no lo vimos :(, enserio necesito ayuda. Si existe alguna pagina o ducumento o libro donde expliquen eso, lo agradecere mucho, o si pudieras explicarmelo rapido y consciso, tambien :).
De antemano. Gracias.
+craftiernemesis Hola !! Te pregunto lo siguiente ¿Has mirado en la API de Java el método getDefaultToolkit de la clase Toolkit que se utiliza en la instrucción del vídeo: Toolkit.getDefaultToolkit().beep() ?
Necesito que me respondas a esto antes de seguir aclarándote la ayuda.
Un saludo
Ooo..ya, si es static el metodo, gracias, me habia confundido creyendo que las clases tambien podian serlo, ahora, si no existiera este video u otra informacion, como sabria yo que primero debo crear el Default Toolkit y luego encadenar el beep()? podria incluso encadenar otro recurso de esa clase en la misma linea?.
Saludos, y gracias por contestar :D.
jejejeje, si no hubiera nadie que te lo explicara sería difícil que tú solo averiguaras tal cosa. Pero para eso están los libros y los cursos... Un saludo !!
Una pregunta?? estoy utilizando linux pero en mi caso no sonó, alguien de casualidad que sepa por que?? o si hay otra instrucción que deba poner, les agradecería bastante..
pruba importando la libreria java.awt.Toolkit
Listo prof. ya solucione el problemita....
Perfecto !! Un saludo
La verdad no entendi nada, repetí el vídeo dos veces, pero de igual forma se agradece el contenido. Saludos!
hola no me aclaro con los del punto por ejemplo esta classe Toolkit.getDefaultToolkit().beep(); esta llamado dos methodos a la vez o getDefaultToolkit() es una classe que llama a methodo beep() o getDefaultToolkit() es un methodo que el methodo beep() esta el interior?.
igual que el System.out.println().
entiendo los codigos con los puntos de esta manera = e.dame_nombre()+e.dame_sueldo()+e.dame_fecha_contrato()
se que el primero(System) es una classe y el tercero(println()) un methodo pero el segundo(out) no se si es un methodo o una classe.
Toolkit.getDefaultToolkit().beep() es diferente de System.out.println(). necesito tu ayuda para superarlo gracias y
un saludo
Hola, yo también tenía la misma duda pero revisando más abajo tienes una respuesta de Juan al usuario SONGXISTO en el que explica el por qué de esto. Son dos métodos distintos y se puede invocar dos métodos a la vez, la clase simplemente es toolkit.
Mi duda es, si el método beep() es dinámico (creo que se llamen así los métodos no estáticos), por qué no instancias un objeto de tipo toolkit?
Toolkit miSonido = new Toolkit();
miSonido.beep();
Sin embargo, simplemente al intentar crear en eclipse un objeto de tipo toolkit me da error y me dice que no se puede instanciar un objeto de tipo toolkit. Hasta donde yo se las clases abstractas se pueden instanciar igual que las clases normales, y si no se pueden instanciar, por qué dice la API que tiene un método constructor Toolkit()?
Creo que tengo un buen jaleo... Espero tu respuesta maestro, muchas gracias por todo.
Todo lo que dices es correcto excepto que las clases abstractas se pueden instanciar. Una clase abstracta no se puede instanciar. Respecto a lo del constructor de la clase abstracta, existe para que lo utilices desde las clases hijas con la instrucción "super". Quizá este link te pueda aclarar algo: es.stackoverflow.com/questions/228/clase-abstracta-con-constructor
Un saludo!!
Gracias!!! Chévere 🍌2024!!!
Muy buenas Juan tengo un error en el código pero no consigo resolverlo, he hecho 2 veces el vídeo y no consigo resolverlo. Me sale este error:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
No enclosing instance of type PruebaTemporizador2 is accessible. Must qualify the allocation with an enclosing instance of type PruebaTemporizador2 (e.g. x.new A() where x is an instance of PruebaTemporizador2).
at poo.PruebaTemporizador2.main(PruebaTemporizador2.java:16)
El error me lo da en la linea que pone:
Reloj mireloj=new Reloj(3000,true);
Te pego todo el código por si te lo puedes mirar porque ya no se que puede estar mal, aquí va:
package poo;
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
public class PruebaTemporizador2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Reloj mireloj=new Reloj(5000,true);
mireloj.enMarcha();
JOptionPane.showMessageDialog(null, "Pulsa aceptar para terminar");
System.exit(0);
}
class Reloj{
public Reloj(int intervalo,boolean sonido){
this.intervalo=intervalo;
this.sonido=sonido;
}
public void enMarcha(){
ActionListener oyente= new dameLaHora2();
Timer miTemporizador=new Timer(intervalo,oyente);
miTemporizador.start();
}
private int intervalo;
private boolean sonido;
private class dameLaHora2 implements ActionListener{
public void actionPerformed(ActionEvent evento){
Date ahora= new Date();
System.out.println("Te pongo la hora cada 3 sg "+ahora);
if(sonido){
Toolkit.getDefaultToolkit().beep();
}
}
}
}
}
Tenía el mismo problema. Lo solucione con esto: stackoverflow.com/questions/18690770/no-enclosing-instance-of-type-is-accessible
Ayuda
no puedo ejecutar porque me sale el error en la clase DameLaHora2:
package poo;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
import java.awt.Toolkit;
public class PruebaTemporizador2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Reloj mireloj=new Reloj(3000, true);
mireloj.enMarcha();
JOptionPane.showMessageDialog(null, "Pulse Aceptar para terminar");
System.exit(0);
}
}
class Reloj{
public Reloj(int intervalo, boolean sonido){
this.intervalo=intervalo;
this.sonido=sonido;
}
public void enMarcha(){
ActionListener oyente=new DameLaHora2();
Timer mitemporizador=new Timer(intervalo, oyente);
mitemporizador.start();
}
private int intervalo;
private boolean sonido;
private class DameLaHora2 implements ActionListener{
public void actionPerformer(ActionEvent evento){
Date ahora=new Date();
System.out.println("Te pongo la hora cada 3 seg " + ahora);
if(sonido){
Toolkit.getDefaultToolkit().beep();
}
}
}
}
Hola !! Error de sintaxis aquí: public void actionPerformer(ActionEvent evento){....
Es actionPerformed terminado en "d" y no en "r". Todos los IDE marcarán la clase como error. Si dejas el ratón quieto encima del error es fácil de averiguar. Un saludo!!
muy buenas profe no se por que me sale error en private class Damelahora implements ActionListener le doy vueltas y vultas y nada que sale
package clasesinternas;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.Timer;
import java.awt.Toolkit;
/**
*
* @author JONATHANP
*/
public class Temporizador {
public Temporizador(int intervalo, boolean sonido){
this.intervalo=intervalo;
this.sonido=sonido;
}
public void iniciar(){
ActionListener oyente= new Damelahora();
Timer miTemporizador=new Timer(intervalo,oyente);
miTemporizador.start();
}
private int intervalo;
private boolean sonido;
private class Damelahora implements ActionListener{
public void ActionPerformed(ActionEvent evento){
Date ahora=new Date();
System.out.println("LA HORA CADA 5S: "+ahora);
if(sonido==true){
Toolkit.getDefaultToolkit().beep();
}
}
}
}
Porque ActionPerformed va en minúscula: actionPerformed. Un saludo!!
@@pildorasinformaticas me salvo gracias saludos desde Perú
Es la primera vez que veo eso de poner un metodo detras de otro... Toolkit.getDefaultToolkit().beep();...
Podrias decirme exactamente que hace?
Si tiene un nombre o algo?
He visto todos los videos anteriores y no lo he visto. Talvez se me paso.
A ver asi explicando a grandes rasgos no se muy bien como estara programada la clase abstracta toolkit pero eso de llamar a un metodo detras de otro es simple pongamos un ejemplo tenemos 2 clases(clase A y clase B) y el main .
Supongamos que en tu clase A creas un metodo que llamas "imprimirmensaje" ( Este metodo lo que hace es imprimir un mensajito por pantalla) y la clase B es una clase con sus variables y un objeto de la clase A (es decir de la clase anterior), suponiendo que en la clase B creas el constructor y los getter y setters(entiendo que sabes lo que son los getters y setters si no dimelo) correctamente si tu ahora en el main creas un objeto de la clase B podrias acceder a la clase A pork la clase B tiene un objeto de la clase A entre sus variables entonces en el main podrias imprimir el mensajito de la clase A usando metodos de la clase B y la A.
ejemplito
piblic class ClaseA{
public void imprimirmensaje(){
System.out.println("Hola");
}
}
public class ClaseB {
private claseA var1;
public ClaseB() { //constructor vacio ya que la claseA no tiene ningun dato al que darle valor
}
public claseA getVar1() {// metodo que te devuelve el objeto ClaseA tal cual (conocido como getter)
return var1;
}
}
public static void main(String[] args){
ClaseB var2= new ClaseB();// creo el objeto de la clase B y lo instancio
var2.getVar1().imprimirmensaje(); // aqui solo estas pidiendole a la claseB que te de el objeto claseA que el tiene y despues como ya tienes el objeto claseA le dices que imprima el mensaje llamando al metodo d ela clase A el hace lo mismo pero con metodos mas que hacen otras cosas mas avanzadas que esto.Y estos epuede llevar al extremo de llamar a metodos dentro de metodos y asi infinitas veces xD
}
Me vas a coger manía Juan...
Un ejemplar de clase, como comentas en el vídeo, supongo que te refieres a un objeto o instanciación de Clase ¿verdad?
+AhoraVengo Correcto !! De momento manía no.... ;)
Gracias!
Grande!!
En Linux Mint no me genera el Beep :(
Sí, es una de las cosas que varían dependiendo del sistema operativo. Estoy seguro de que habrá forma de sacar el beep con mint, pero desconozco la forma. Un saludo!!
Hola Heyner,
En Ubuntu y derivados, por defecto, está desactivado el beep del sistema. De hecho, yo he conseguido sacarlo a través de Runtime en lugar de Toolkit.
Primero tenemos que asegurarnos que podemos ejecutar un beep en el sistema:
1.- Instalamos el paquete beep. Para ello abrimos un terminal (ctrl + alt + T) y ejecutamos:
sudo apt install beep
2.- A continuación tenemos que cargar el módulo pcspkr. Para ello introducimos en el terminal:
sudo modprobe pcspkr
3.- Comprobamos que ya tenemos activado el beep del sistema. En el terminal tecleamos:
beep
Si todo ha funcionado correctamente (deberíamos escuchar un beep después de teclear la instrucción), tenemos que modificar el archivo blacklist.conf para que se cargue el módulo pcspkr cada vez que se inicie el sistema:
1.- Desde el terminal tecleamos:
sudo gedit /etc/modprobe.d/blacklist.conf
2.- En el archivo que se abre, buscamos la línea que pone blacklis pcspkr y la comentamos poniendo almohadilla delante (#). Debería quedar algo parecido a esto:
# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
# blacklist pcspkr
3.- Guardamos cambios (ctrl + S) y cerramos.
Finalmente, para que el beep funcione en la aplicación Java que estamos desarrollando, tenemos que utilizar la clase Runtime en lugar de Toolkit. Las líneas de código que sustituyen a Toolkit, quedarían:
try {
Runtime.getRuntime().exec("beep");
} catch (IOException ex) {
ex.printStackTrace();
}
Runtime es una clase que permite interactuar con el sistema dónde está corriendo la aplicación Java. De hecho, cada vez que corremos una aplicación Java, se crea una instancia de esta clase. Con la instrucción getRuntime(), lo que estamos haciendo es llamar a la instancia Runtime actual y con el método exec(String s), ordenamos al sistema que ejecute el comando que le hemos pasado como String (equivaldría a abrir un terminal y ejecutar el comando beep).
Maquina
Entendí lo de las clases internas, pero mi duda viene sobre cuando usas el método beep. La cosa es que andaba mirando el método beep y me doy cuenta con que es abstracto y me llega la duda: ¿Cómo lo uso?, me acuerdo de el tema de las clases abstractas y me acordé en especifico que cuando una clase hereda de otra que es abstracta se tiene que cumplir todos los métodos; pero tú solo utilizaste el método beep, y esto no es una clase y me doy cuenta de que usas la siguiente instrucción: Toolkit.getDefaultToolkit().beep(); y me doy cuenta de que cuando pones Toolkit.getDefaultToolkit() pones otro método y eso me causó confusión pero creo que tengo la respuesta.
Creo que se aplica algo similar a lo de las clases abstractas, en específico lo de que cuando una clase hereda de una clase abstracta esta tiene que sobrescribir sus métodos, y creo que en la parte después de getDefaultToolkit cuando pones el otro método el método beep hereda de getDefaultToolkit.
Pero la pregunta de el millón ¿ cuándo veo una clase en la api de java que tenga algo así: public abstract void beep (), cómo la utilizo?
Sé que es difícil responder a tantos comentarios y darnos "Píldoras informáticas" todos los días; pero aprovecho para darte las gracias a tus excelentes videos.
PD: Creo que voy a terminar con sobredosis de "Píldoras informáticas" xD
Manuelito jajajajajaja tómate un descanso. Debes utilizar el método como otro cualquiera. Que sea abstracto indica que está sin implementar (solo declarado) y que obligatoriamente la clase a la que pertenece (en este caso Toolkit) es obligatoriamente abstracta.
getDefaultToolkit nos devuelve un objeto Toolkit. ¿Qué es un objeto Toolkit? El sistema de ventanas donde se está ejecutando la aplicación. Lo que hace es obtener tu objeto Toolkit gracias a getDefaultToolkit y aplicar después sobre él un beep (sonido)
Saludos
+Manuelito Creo que la clase que hizo (PruebaTemporizador2) no implemento o heredo de la clase toolkit solo utilizo el metodo beep( ) por eso no tuvo que cumplir como dices con los otros metodos. Creo yo que por ahi va la duda.
debes retroceder los videos por que se puede importar todo el paquete .*; o uno en especifico java.awt.Toolkit;
@@pildorasinformaticas quizá mi pregunta sea muy tonta pero como puede hacer el método beep() algo si es abstracto, es decir no tiene código dentro ?
HOLA añado una corrección que me surgio quizas sea por la version actual de java por que todo el código es = como lo dijo el profesor salvo que al momento de escribir la clase DameLaHora e instanciar la misma me pide que la clase si o si sea static si no no me deja dejo el codigo a continuación al programa lo estoy corriendo con INTELLIJ
package poo;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.event.*;
import java.util.*;
public class Prueba_temporizador {
public static void main(String[] args) {
DameLaHora oyente = new DameLaHora();
//ActionListener oyente = new DameLaHora;
Timer miTemporizador = new Timer(5000,oyente);
miTemporizador.start();
JOptionPane.showMessageDialog(null,"pulsa aceptar para detener");
System.exit(0);
}
static class DameLaHora implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
Date ahora = new Date();
System.out.println("Te pongo la hora cada 5 segundos: " + ahora);
}
}
}
WAOO! EL MIO SONABA COMO SI CON UN CUBIERTO LE DES UN GOLPECITO A UNA COPA... AHHH!!.. QUE BONITO!!!
04/05/2020
Hola que tal!!! Pregunta si aquí estamos agregando la Clase Abstracta Toolkit por que no se hizo un extends a la Clase DamelaHora2() y por que no se agregaron todos los métodos abstractos pertenecientes a la Clase Abstracta Toolkit, aquí solo agregaste Toolkit.GetDefaultToolkit.beep()
Carlos Hernandez Hola !! Hace tiempo que grabé este vídeo y no recuerdo exactamente qué comenté en él. Tendría que verlo entero a no ser que me digas el minuto y segundo exacto donde surge tu duda.
Pero creo recordar que aquí no heredamos de la clase Toolkit. Si lo hiciéramos, entonces sí tendríamos que sobreescribir todos los métodos de la clase abstracta Toolkit que no son pocos. En el ejemplo creo recordar que nos limitamos a usar la clase Toolkit con la instrucción Toolkit.GetDefaultToolkit.beep(), que para eso están en la API, para utilizarlos.
Un saludo.
pildorasinformaticas A OK entonces lo que entiendo es que al ser una clase abstracta Toolkit si lo que requiero es ocupar alguno de sus métodos de esta, no necesariamente tengo que extenderla solo tengo que importar la Clase Toolkit a mi clase y llamarla como en tu ejemplo a Toolkit.GetDefaultToolkit.beep().
Esto es correcto?
Debes importar el paquete. pero no porque sea abstracta, sino porque esto hay que hacerlo siempre que quieras utilizar una clase que no pertenezca al paquete java.lang
No te confundas con lo siguiente: una cosa es utilizar una clase y otra cosa diferente es heredar de una clase. Si heredas una clase abstracta estás obligado a sobreescribir todos los métodos de la clase, pero si solo la utilizas, no estás obligado a sobreescribir los métodos.
un saludo
Alguien quien sea tan amable de explicarme, por qué la función actionPerformed(ActionEvent evento) de la clase interna DameLaHora2 se ejecuta, si nunca llamamos a ese método en el código? Porque entiendo todo menos eso :(
si que se ejecuta al instanciar la clase Timer en el segundo parámetro lo estas llamando
A ver si sé responderte: Timer necesita un "oyente" y este oyente es una "instancia de interfaz" tipo ActionListener creada mediante la clase Damelahora2, ya que no se puede instanciar una interfaz directamente.
Es la clase Timer la que hace uso interno del método "actionPerformed" perteneciente al objeto oyente
Vale siento la pregunta no terminé de ver el vídeo jajaa soy un impaciente, tuve que dejar el vídeo a medias y... en fin fallo mío!!
Pues la primera pregunta de momento no la veo, pero me alegro de que se haya solucionado. Saludos!!
Era sobre implementar ActionListener, pensé que en este caso no íbamos a hacerlo y no entendía por qué, tuve que dejar el vídeo a medias y por eso no llegué a ver que si lo haríamos. Fallo mío soy un impaciente jajaja
26/10/2020
Me sucedio lo mismo que con el video anterior con la clase private class DameLaHora2
yo pense q me iva dar error por que me salia siempre ese sonido cuando me salia un error pero asi era el sonidito ese jajajaja me cage
adjunto codigo con comentarios para el que le sirva.... Gracias por la enseñanza Juan
package v52_v53_interfaces_clases_internas_temporizador;
import java.awt.Toolkit;
import java.awt.event.*; //para la interfaz
import javax.swing.Timer; // para el la clase Timer. CONSTRUIMOS un timer que usa 2 parámetros de tipo tiempo en milise
//segundos y una interfaz listener.
//no se importó con * porque java.util tambien tiene una clase timer que es para otras cosas
//sale error si no se dice cual
import java.util.*; //para el Date
import javax.swing.JOptionPane; //para el JOptionPane
//v53 uso de clase Toolkit que hace una especie de puente entre los recursos del SO y nuestro programa
import java.awt.Toolkit;
public class Temporizador {
public static void main (String[] args){
//creamos una instancia de la clase Reloj, mi_reloj con los parametros del constructor
Reloj mi_reloj = new Reloj (5000, true); //cada 5 segundos con sonido en true
//llamamos al metodo set que consifguró la manera de hacer arrancar el reloj
mi_reloj.set_temporizador(); //el objeto ejemplar de clase mi reloj y el METODO de la clase Reloj
//necesitamos mantener el programa en ejecución hasta que querramos con una ventana de JOptionPane.showMessageDialog
JOptionPane.showMessageDialog(null, "Pulsa Aceptar para Detener"); //el timer se ejecuta hasta que le demos aceptar
//luego se pasa a System.exit(0); y sale
System.exit(0); //hace que el programa se detenga, luego de pulsar aceptar, ya que el codigo baja y lo lee
}
}
// Creación de la clase Reloj para hacer clase sobre clase
class Reloj {
//declaramos variables private
private int intervalo; //aqui se almacenan los 5000 milisegundos
private boolean sonido; //aqui se almacena el true
//creamos el constructor
public Reloj (int intervalo, boolean sonido ) {
this.intervalo = intervalo;
this.sonido = sonido;
}
//creamos un METODO set para configurar el temporizador
public void set_temporizador(){
ActionListener listener = new Dame_Hora2(); //instancia de un objeto ActionListener, interfaz, con el constructor de clase
//dame_hora2, la cual será INTERNA DE LA CLASE RELOJ,
//SE CONSTRUYE DE ULTIMO
Timer temporizador = new Timer (intervalo, listener); //instancia del objeto temporizador de la clase Timer
//con los parametros del intervalo de tiempo y
//el objeto de la clase interfaz ActionListener
temporizador.start(); // para que arranque
}
//creacion de la clase interna Dame_Hora2 dentro de la clase Reloj
private class Dame_Hora2 implements ActionListener{ //implementa la intefaz ActionListener
//creamos el metodo exigido por la interfaz ActionListener que es actionPerformed (ActionEvent e)
public void actionPerformed(ActionEvent e) {
Date tiempo_actual = new Date(); //objeto tipo fecha, tiempo_actual
System.out.println ("La hora actual es cada 7 segundos :" + tiempo_actual);
//configuramos el BOOLEAN SONIDO
if (sonido = true) { //la ventaja de la clase interna es acceder a los campos del ejemplar que la contiene
//en este caso accede a la variable de clase sonido que está fuera de ella pero
//pertenece a su clase padre contenedora. ahorramos crear set o get para usar esas
//variables private
//usamos la herramienta del SO que nos saca el sonido del SO.beep
Toolkit.getDefaultToolkit().beep();
}
}
}
}//FIN DE LA CLASE Reloj
👀
no veo la ventaja de lo que puede aportar tener una clase interna
22/11/2024
- Hijo, ¿qué has aprendido hoy?
- Una clase interna es una clase dentro de otra
:V