|
Mostrar Mensajes
|
Páginas: [1] 2
|
1
|
Programación / Java / Capturar las respuestas del servidor con un objeto WebEngine
|
en: 11 Junio 2017, 17:58 pm
|
Con los objetos WebEngine de JavaFX, es posible interactuar con una página web y extraer sus datos. Pero si son actualizados con mucha frecuencia, recargar la página para obtener el código HTML actualizado o revisar cada nodo para saber cuál ha cambiado, es ineficiente. Por ello, y debido a que las peticiones y respuestas HTTP suelen ser hechas con JQuery, probé a ver las respuestas del servidor añadiendo en la consola del navegador el código javascript: $(document).ajaxSuccess(function(event, xhr, settings){ alert(xhr.responseText); });
Y tras comprobar que funciona en el navegador, quise incluirlo en Java escribiendo el código siguiente: import javafx.application.Application; import javafx.beans.value.*; import javafx.scene.Scene; import javafx.scene.control.TextArea; import javafx.scene.web.WebEngine; import javafx.stage.Stage; //import javafx.concurrent.Worker.State; import org.w3c.dom.Document; import netscape.javascript.JSObject;
@SuppressWarnings("restriction") public class Captura extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage escenario){ final TextArea área_texto = new TextArea(); área_texto.setEditable(false); // 'ingenio' será el objeto que conecta con "webkit" para operar con HTML, javascript y CSS. final WebEngine ingenio = new WebEngine(); // 'ventana' es el objeto que permite conectar javascript con Java. final JSObject ventana = (JSObject)ingenio.executeScript("window"); // Esto establece el vínculo entre "jHelper" en javascript y "JavaHelper" en Java. ventana.setMember("jHelper", new JavaHelper(área_texto)); // Esta estructura supuestamente es para ser ejecutada al cargar la página web, pero // no entiendo bien esta parte. ingenio.documentProperty().addListener(new ChangeListener<Document>(){ @Override public void changed(ObservableValue<? extends Document> observable, Document oldDoc, Document newDoc){ // Esto pondrá en la ventana el código inicial HTML. área_texto.setText((String)ingenio.executeScript("document.documentElement.innerHTML")); // Esto es para comprobar si al ejecutar el código, realmente es alcanzada esta parte, // algo que muchas veces no ocurre. System.out.println("Llegué."); // Esto capturará el tráfico HTTP con javascript. ingenio.executeScript("$(document).ajaxSuccess(function(event, xhr, settings){ jHelper.respuesta(xhr.responseText); });"); } }); ingenio.load("http://www.sportium.es"); escenario.setScene(new Scene(área_texto, 800, 600)); escenario.show(); } // Esta clase servirá para llamar a Java desde javascript. public static class JavaHelper{ // 'área_texto' será el objeto donde será mostrado el código HTML inicial, y las // respuestas capturadas. final TextArea área_texto; // 'cont' indicará el número de respuestas que han sido capturadas y mostradas. private int cont = 0; public JavaHelper(TextArea área_texto){ this.área_texto = área_texto; } // 'texto' contendrá el mensaje de respuesta del servidor. public void respuesta(String texto){ ++cont; área_texto.setText("\n"+cont+":\n"+texto); } } }
Lo curioso es que unas veces es abierta una ventana y se queda en blanco, otras aparece el código HTML inicial y se queda así, y otras presenta el código y lo cambia por la primera respuesta del servidor, y se queda así también. Necesito Lo que necesito saber es porqué no me funciona como en el navegador, captando sólo la respuesta primera en el mejor de los casos, y cómo corregirlo, pues no sé cómo resolverlo.
|
|
|
2
|
Programación / Java / Re: colgar un paper
|
en: 29 Julio 2016, 17:24 pm
|
Ni siquiera sé lo que estás preguntando, y es probable que haya más gente como yo, así que sería bueno que expliques tu problema mejor.
|
|
|
3
|
Programación / Java / Re: [Duda] Clases abstractas
|
en: 28 Julio 2016, 12:53 pm
|
Una variable encerrada entre dos llaves cualesquiera, son locales, y fuera de tales llaves no existirá. Incluso si escribo: { int i; } i = 0;
Tendré un error, porque la variable 'i' existe solamente dentro de las llaves, y no fuera. En tu caso particular, la variable 'nombre' está en el cuerpo de una función, por lo que será local a tal función. No podrás usarla fuera de ella. Así que si quieres hacerlo, tendrás que poner tal variable fuera de la función, y ponerle su valor llamando a tal función. Y para que quede más claro; yo pondría: public class Estudiante_Postgrado extends Estudiante { String nombre; public void postgrado(){ System.out.println("Ingrese sus datos de Estudiante de Post-Grado: "); } ... }
|
|
|
4
|
Programación / Java / Re: Sacar el promedio de un arrar
|
en: 26 Julio 2016, 10:50 am
|
¡Ufff! Creo que por fin me he enterado, aunque el modo de expresarlo es confuso: si para cada unidad de un mismo producto sumas el promedio a una variable de valor inicial 0, entiendo que no hace falta calcularlo, pues el promedio por el número de unidades, es la suma total de precios. Por ejemplo, si un alumno en matemáticas ha obtenido como notas 5, 7 y 8, el promedio es (5 + 7 + 8)/3 = 20/3 = 6'66..., y 20/3 + 20/3 + 20/3 = 20/3 · 3 = 20, que es la suma total, por lo que habría bastado calcular 5 + 7 + 8 = 20 directamente. El método siguiente imprimirá los datos como en el ejemplo que has dado, pues dar la lista de promedios sin más, no me parece útil. El código lo he escrito aquí directamente, por lo que debe ser probado para asegurar su corrección. // Este objeto es de una clase anónima. Es definido fuera de la función, para no // tener que hacer el objeto en cada llamada al método. private Comparator<venta> comp = new Comparator<>(){ @Override public int compare(venta prod1, venta prod2){ return prod1.nombreProducto.compareTo(prod2.nombreProducto); } }; public void getPromedioGeneral(venta[] vec){ // Si no hay elementos que imprimir, ésto hará terminar al método. if(vec.length == 0){ return; } // Esto ordenará los productos según su nombre. Arrays.sort(vec, comp); venta producto = vec[0], producto2; double promedio = producto.precio, cont = 1d; int i = 0; while(++i < vec.length){ producto2 = vec[i]; if(producto.nombreProducto.equals(producto2.nombreProducto)){ promedio += producto2.precio; ++cont; } else{ if(cont > 1){ promedio /= cont; } System.out.println(producto.nombreProducto+": "+promedio); producto = producto2; promedio = producto2.precio; cont = 1d; } } // Como el bucle imprime un producto, cuando aparece otro solamente, faltará el // último producto registrado en la variable 'producto'. if(cont > 1){ promedio /= cont; } System.out.println(producto.nombreProducto+": "+promedio); }
Y los programadores suelen poner nombres a las clases, con una letra mayúscula inicial, para distinguirlos mejor de los nombres de variables. Si haces programas menos sencillos, sería bueno que tengas esa costumbre.
|
|
|
5
|
Programación / Java / Re: Sacar el promedio de un arrar
|
en: 21 Julio 2016, 14:09 pm
|
Si entiendo que quieres hacer una lista, pero no sé si el mismo producto tiene el mismo precio, en cuyo caso no tiene sentido hacer un promedio, pues sería el precio que tienen en común; o si como sugiere ahora tu ejemplo hay varios productos con el mismo nombre y precios distintos, y quieres obtener el promedio.
|
|
|
6
|
Programación / Java / Re: Como obtener los valores de una matriz de JTextField
|
en: 21 Julio 2016, 14:04 pm
|
Para obtener el contenido de cada campo de texto, basta escribir: String texto = campo.getText(); Y si quieres convertirlo a un número "double", puede escribir: double número = Double.parseDouble(campo.getText()); Así que en tu caso basta que pongas: int ancho = matriz.length, alto = matriz[0].length; double[][] matriz2 = new double[ancho][alto];
for(int i = 0, j; i < ancho; ++i){ for(j = 0; j < alto; ++j){ matriz2[i][j] = Double.parseDouble(matriz[i][j].getText()); } } No obstante, lo he escrito así para simplificar; si no habría puesto un código con varias optimizaciones. La verdad es que lo que necesitas no tiene dificultad. Debes mirar más la documentación de Java, y los ejemplos que hay por internet.
|
|
|
7
|
Programación / Java / Re: Combinar un método de ordenamiento y busqueda
|
en: 19 Julio 2016, 11:01 am
|
La pregunta es imprecisa. Pareces querer combinar una búsqueda binaria con un algoritmo de ordenación, pero lo primero puede hacerse cuando ya es tenida la ordenación apropiada de los elementos. Como dijo DarK_FirefoX, si quieres ordenar y buscar, puedes verificar todos los elementos y comprobar si alguno es el buscado, pero tendrías que verificar un mismo elemento varias veces, lo cual no es eficiente. Lo único adecuado es ordenar primeramente, y buscar el elemento o elementos requeridos después.
|
|
|
8
|
Programación / Java / Re: operardor >> en java
|
en: 19 Julio 2016, 10:43 am
|
En Java hay 3 operadores de desplazamiento de bits: 1) El operador <<, que desplaza todos los bits hacia la izquierda tantas posiciones como sea indicado, dejando a la derecha valores nulos. Los bits no nulos que no quepan serán perdidos, y si hay una conservación del signo, equivale a multiplicar por 2 elevado al número de bits desplazados. Es decir: int n = 1 << 5 Equivale a hacer: int n = 1*32 Porque 2^5 = 32. Pero: int n = 1 << 31 Equivale a poner: int n = Integer.MIN_VALUE Número que es -2147483648, porque al ser 1 el bit de la posición 31 el número es negativo, y si todos los demás son nulos, es el entero menor de todos. Las razones de éso no las daré aquí, sino que es suficiente con saber que si como consecuencia del desplazamiento, cambia el bit de la posición 31, siendo el primero el bit de la posición 0, el número cambiará de signo. 2) El operador >>>, que desplaza todos los bits hacia la derecha tantas posiciones como sea indicado, dejando a la izquierda valores nulos. Los bits no nulos que no quepan serán perdidos, y si hay una conservación del signo, equivale a dividir por 2 elevado al número de bits desplazados. Si el número era negativo, este desplazamiento lo hará positivo, porque el bit de la posición 31 pasará de ser 1 a ser 0. 3) El operador >>, que desplaza todos los bits menos el del signo hacia la derecha tantas posiciones como sea indicado, por lo que el número conservará su signo, algo que ninguno de los otros dos garantiza, por lo que siempre equivale a dividir por 2 elevado al número de bits desplazados. El operador >> de C y C++, cumple la función que en Java cumple el operador >>>.
|
|
|
9
|
Programación / Java / Re: Sacar el promedio de un arrar
|
en: 19 Julio 2016, 10:07 am
|
Si lo he entendido bien, quieres considerar como agrupados los productos iguales dentro de la colección (= array), y dar el promedio de su precio. Por ello:
1) Entiendo que si dos productos son iguales, su precio es el mismo, por lo que su promedio es su precio, a no ser que éste varíe con el tiempo.
2) Si quieres calcular el porcentaje de facturación que ha supuesto la venta del producto, éso sí requiere hacer algo del estilo de lo que has puesto.
3) En cualquiera de los dos casos, lo más eficiente y sencillo es ordenar los elementos de la colección, para que al hallar un nombre distinto, no sea necesario considerar más veces la clase de producto ya tratado, pues ya habrán sido tratados todos.
Una vez que sepa bien qué quieres, podría darte el código que yo propongo para resolver tu problema, pero es mejor que lo hagas tú, o al menos lo intentes. Aprender a programar bien es difícil, requiere mucho esfuerzo y no siempre podrás hallar a otro para que te lo haga.
|
|
|
10
|
Programación / Java / Acceso restringido a librerías de Java
|
en: 18 Julio 2016, 13:14 pm
|
Hola a todos. Yo quería implementar mi propia clase de Java, reescribiendo la clase HttpUrlConnection de Java, pero en la parte: import sun.net.www.http.HttpClient; import sun.net.www.http.PosterOutputStream; import sun.net.www.http.ChunkedInputStream; import sun.net.www.http.ChunkedOutputStream; En cada una de las líneas aparece un subrayado rojo sinuoso indicando un error, con unos mensajes asociados los cuales son respectivamente: Access restriction: The type 'HttpClient' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar') Access restriction: The type 'PosterOutputStream' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar') Access restriction: The type 'ChunkedInputStream' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar')
Access restriction: The type 'ChunkedOutputStream' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar')
Por ello tengo varias preguntas, que me intrigan desde hace mucho tiempo: 1) ¿Cómo pueden restringir el acceso a una librería, aunque sea utilizado por el lenguaje en otras clases predefinidas, que sí puedo utilizar? 2) ¿Podría restringir el uso de una clase hecha por mí? 3) ¿Puedo utilizar de algún modo tales clases restringidas, en una clase hecha por mí? Y gracias por vuestra atención.
Bueno. Parece que no gustó mucho el problema que propuse, y cuya solución hallé al menos en parte. En acceso restringido a ciertas librerías, es una limitación de configuración del entorno de desarrollo, que puede ser eliminada. Para hacerlo en eclipse, hay que hacer clic con el botón derecho del ratón sobre la carpeta del proyecto, para desplegar el menú contextual, ir a Propiedades --> Java Compiler --> Error/Warnings --> Deprecated and restricted API; y en la lista asociada a la línea que pone "Forbidden reference (access rules)", cambiar la opción "Error" por cualquier otra. "Java compiler" es una opción de una lista, que tiene una sublista que hay que desplegar para acceder a "Error/Warnings". "Deprecated and restricted API" es una opción de una lista, sobre la que hay que hacer clic para desplegar su cuadro de opciones, pero como la que está desplegada por defecto es la opción primera, que es de contenido extenso, puede parecer que no está. Entonces, respondiendo a cada una de las cosas que pregunté: 1) Programando el entorno de desarrollo para que considere ciertas clases restringidas. 2) El entorno de desarrollo no da la opción de decidir cuáles son las clases restringidas, por lo que no, a menos que sea modificado el código fuente del entorno para ello, y serviría para el nuevo entorno de programación solamente. 3) Sí, como ya he indicado.
Me olvidé de un detalle: la lista de opciones asociado a "Error/Warnings" está desactivada, y hay que activarloa marcando la casilla superior de la ventana, que pone "Enable project specific settings". MOD EDIT: No hacer doble post.
|
|
|
|
|
|
|