elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Java / Re: Obligar a una clase a tener un cierto método estático. en: 4 Agosto 2023, 23:22 pm
Exacto. Algo así haré. Muchas gracias.  ;)
2  Programación / Java / Re: Obligar a una clase a tener un cierto método estático. en: 4 Agosto 2023, 15:48 pm
Hola.

Creo que hay terminos un poco, raros que quieres aplicar.

Puedes tranquilamente usar una interface "Grupo" con un método default es decir con implementación por defecto.

Código
  1. interface Group {
  2.  
  3.    static Integer sumaStatica(Integer number, Integer number2) {
  4.        return number + number2;
  5.    }
  6.  
  7.    default Integer sumaDefault(Integer number, Integer number2) {
  8.        return number + number2;
  9.    }
  10. }
  11.  
  12. public class HolaMundo implements Group {
  13.  
  14.    public HolaMundo() {
  15.        final Integer sumaPeroEnConstructor = sumaDefault(1,3);
  16.        System.out.println("Resultado por metodo por default: " + sumaPeroEnConstructor);
  17.    }
  18.  
  19.    public void otroMetodoMas() {
  20.        sumaDefault(1,2);
  21.        Group.sumaStatica(1, 2);
  22.    }
  23.  
  24.    public static void otroMetodoMas2() {
  25.        //Error
  26.        sumaDefault(1, 2);
  27.        Group.sumaStatica(1, 2);
  28.    }
  29.  
  30.    public static void main(String[] args) {
  31.        new HolaMundo();
  32.        //Usando metodo estatico aqui
  33.        final Integer resultado = Group.sumaStatica(1, 2);
  34.        System.out.println("Resultado por metodo por static: " + resultado);
  35.    }
  36.  
  37. }
  38.  
  39.  

Hay tienes una variante,

Los métodos default puedes invorcalos solo si "tu" quieres y en métodos no static, como en la línea "15" y "20"

Y estoy seguro que esto no te ayudara, jaja, porque tienes la mente en sobreComplicar las cosas ya mismo, a veces los genericos sobre complican las cosas en ciertos casos.

Para lo que quieres hacer es mejor especificar y listo, por existe la clase Interger, Double, Long, etc, especificaciones para estos casos.


 ;D ;D ;D

Gracias igualmente por la ayuda, el problema es que necesito que devuelva un tipo genérico. En ocasiones necesitaré que sea un tipo que no tiene nada que ver con las clases Integer, Double, etc.

Creo que simplemente renunciaré a las versiones estáticas y lo haré todo a partir de métodos no estáticos, que con eso me funciona bien.

Gracias. Un saludo.
3  Foros Generales / Dudas Generales / Re: ¿Es posible evitar un cruce de líneas en este diagrama? en: 4 Agosto 2023, 11:01 am
Hola.

Para demostrar que un grafo no es plano, es decir, que no se puede evitar que dos aristas se corten, se suele utilizar el https://es.wikipedia.org/wiki/Teorema_de_Kuratowski.

En tu caso se puede evitar, aunque dependiendo de lo que haya a la derecha del nodo del que sale la flecha roja es posible que el resultado sea menos claro. Debes pasar la flecha que sale del nodo rosa y va al granate por debajo del nodo del que sale la flecha roja y de lo que salga a su derecha.

Un saludo.

4  Programación / Java / Obligar a una clase a tener un cierto método estático. en: 4 Agosto 2023, 10:29 am
Hola.

Quisiera saber si es posible obligar a una clase a tener un método estático que encaje en un cierto patrón. Me explico. Por ejemplo, imaginemos que tenemos una clase "Entero" que pretende implementar las operaciones con números enteros y que tiene un método estático llamado "suma", que básicamente devuelve la suma de dos números enteros pasados por parámetro y cuya declaración es del tipo:

Código
  1. public static Entero suma (Entero entero1, Entero entero2){/*...*/}
  2.  

También podríamos tener una clase "Real" que pretenda implementar las operaciones que se pueden hacer con números reales y que podría tener declarado un método "suma" tipo:


Código
  1. public static Real suma (Real real1, Real real2){/*...*/}
  2.  

Pues bien, me gustaría poder trabajar con una clase que trabaje con elementos de una clase genérica que obligatoriamente tenga declarado un método de este tipo sin importar que sean enteros, reales o lo que sea... Por ejemplo, imaginemos que queremos declarar una clase "Vector", que contendrá elementos de una clase genérica (que pueden ser enteros o reales) y queremos definir la suma de vectores a partir de la suma de sus elementos. Algo así:

Código
  1. public class Vector <Elemento /*Aqui es donde me gustaria indicar que Elemento debe implementar una interfaz, o extender una clase o algo asi*/>
  2. {
  3.    ...
  4.  
  5.    public static Vector <Elemento> suma (Vector <Elemento> vector1, Vector<Elemento> vector2){
  6.        Vector <Elemento> nuevo=new Vector<Elemento> (vector1. getTamanyo());
  7.        for (int i=0; i<nuevo.getTamanyo(); i++){
  8.             nuevo.setElemento(i, Elemento.suma(vector1.getElemento(i),vector2.getElemento(i));
  9.    }
  10.  
  11. }
  12.  

Mi intento ha sido el de declarar una interfaz "Grupo" de la siguiente manera:

Código
  1. public interface Grupo<TipoGrupo extends Grupo>
  2. {
  3.    public static TipoGrupo suma (TipoGrupo e1, TipoGrupo e2);
  4. }
  5.  

Y luego la clase "Entero" declararla así:

Código
  1. public class Entero implements Grupo <Entero> {
  2.  
  3.    ...
  4.  
  5.    public static Entero suma(Entero entero1, Entero entero2){...}
  6.  
  7.  

Pero no funciona... En la interfaz Grupo, en la línea del método "suma", me sale un error que dice que "un tipo de variable no estático como "TipoGrupo" no se puede referenciar desde un entorno estático" lo cual tiene su lógica, y otro error que dice que "falta el cuerpo del método o declararlo abstracto". Si lo declaro abstracto el primer error se mantiene y aparece otro que dice que es ilegal combinar los modificadores static y abstract.

¿Realmente se puede obligar a que una clase tenga un método estático que encaje en una cierta declaración?

Gracias de antemano por la ayuda. Un saludo.
5  Programación / Java / Re: Duda con interfaces gráficas en Java. en: 19 Mayo 2020, 23:13 pm
Hola.

Antes de nada muchas gracias por responder, rub'n.


Bueno mira, respondiendo una parte de tu pregunta, seguro es incompatibilidad del Layout, porque el único Layout multiplataforma es el,

GroupLayout

Entonces como lo seteas a null, pues quizá este la cosa por ahi.


Mmmm... No sé si te he entendido bien. Resulta que el problema desapareció precisamente cuando metí la línea setLayout(null) al principio del constructor de la clase que extiende el JFrame, ¿dices que mejor haber hecho algo con un GroupLayout?

Un saludo y gracias.
6  Programación / Java / Re: Duda con interfaces gráficas en Java. en: 16 Mayo 2020, 20:36 pm
Hola.

Hace unos días solucioné el problema. Se trataba de incluir la línea setLayout(null); en el constructor del JFrame.

No entiendo muy bien por qué esa línea soluciona el problema. ¿A alguien se le ocurre por qué?

Me llama la atención especialmente que el error sólo ocurría en máquinas con Windows, lo he comprobado en dos diferentes. Sin embargo en máquinas con Mac el problema, según parece, no tenía lugar. Pero, ¿no se suponía que con el JPanel y el JFrame no dependían del sistema y que eso era una ventaja sobre el Canvas y el Frame?

Si alguien sabe algo sobre lo que pasa aquí me encantaría que me iluminase un poco. Supongo que ya se ve que estoy un poco verde en el tema y quizás no sea fácil explicármelo, pero estaría muy interesado en aprender algo al respecto.

Gracias de antemano. Un saludo.
7  Programación / Java / Duda con interfaces gráficas en Java. en: 6 Septiembre 2019, 16:58 pm
Hola.

He tenido una pequeña sorpresa programando interfaces gráficas con Java. He simplificado el código manteniendo el problema para que se haga más sencilla su comprensión. Tenemos una clase Prueba2 que extiende un JFrame:

Código
  1. package prueba2;
  2. import java.awt.event.WindowAdapter;
  3. import java.awt.event.WindowEvent;
  4. import java.io.IOException;
  5. import javax.swing.JFrame;
  6. public class Prueba2 extends JFrame   {
  7.    private PanelPrueba Juego;
  8.    public Prueba2() throws IOException{
  9.        Juego=new PanelPrueba();
  10.        getContentPane().add(Juego);
  11.        addWindowListener(new WindowAdapter(){
  12.            public void windowClosing(WindowEvent e){
  13.                System.exit(0);
  14.            }
  15.        });
  16.       Juego.setVisible(true);
  17. }
  18.    public static void main(String[] args) throws IOException {
  19.        Prueba2 J=new Prueba2();
  20.        J.setBounds(0, 0, 400, 400);
  21.        J.setVisible(true);
  22.    }
  23. }
  24.  

Y otra clase PanelPrueba, que extiende un JPanel e implementa un KeyListener:

Código
  1. package prueba2;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.event.KeyEvent;
  6. import java.awt.event.KeyListener;
  7. import static javax.swing.JOptionPane.PLAIN_MESSAGE;
  8. import static javax.swing.JOptionPane.YES_NO_OPTION;
  9. import static javax.swing.JOptionPane.YES_OPTION;
  10. import static javax.swing.JOptionPane.showConfirmDialog;
  11. import javax.swing.JPanel;
  12.  
  13. public class PanelPrueba extends JPanel implements KeyListener {
  14.    public PanelPrueba(){
  15.        setBounds(0,0,200,500);
  16.        addKeyListener(this);
  17.        setFocusable(true);
  18.        requestFocus();
  19. }
  20.    public void paint(Graphics g){
  21.        g.setColor(Color.WHITE);
  22.        g.fillRect(0, 0, 200, 500);
  23.    }
  24.    public void reiniciar() {
  25.        repaint();
  26.    }
  27.    @Override
  28.    public void keyTyped(KeyEvent que) {}
  29.  
  30.    @Override
  31.    public void keyPressed(KeyEvent que)  {
  32.        if(showConfirmDialog(this,"Has ganado,deseas empezar otra partida?","Fin de Partida",YES_NO_OPTION,PLAIN_MESSAGE)==YES_OPTION){
  33.            reiniciar();
  34.        }  
  35.        else{
  36.           System.exit(0);
  37.        }
  38.    }
  39.  
  40.    @Override
  41.    public void keyReleased(KeyEvent que) {}
  42. }

Básicamente lo que pasa cuando aprietas una tecla es que te sale un cuadro de diálogo con dos botones. Si se pulsa "No" la aplicación finaliza y si se pulsa "Sí" vuelve a la situación inicial. La sorpresa está en que si se pulsa "Sí" aparece un molesto texto detrás del JPanel. ¿Alguien sabría explicarme por qué pasa eso, y cómo se puede solucionar el problema?

He estado probando cosas, y si el cuadro de diálogo haces que aparezca con un showMessageDialog en lugar de con un showConfirmDialog el problema desaparece.

Por otro lado, si hago que la clase PanelPrueba extienda un Canvas en lugar de un JPanel el problema desaparece. No obstante, quisiera solucionar el problema con un JPanel, ya que éste es el "peso pesado" de los contenedores, y aporta muchas ventajas, ¿verdad?  ;)

También me gustaría comentar que me han pasado cosas parecidas cuando he añadido objetos de clases JPanel y JButton a un mismo JFrame, y que estos problemas han desaparecido igualmente utilizando Canvas.

Agradezco de antemano cualquier tipo de ayuda o comentario y el tiempo que os haya tomado atenderme.

Un saludo a todos.
8  Programación / Java / Re: Duda manejando eventos de teclado en Java en: 11 Julio 2019, 19:04 pm
Hola rub'n.

Antes de nada muchas gracias por tu respuesta, me ha sido muy útil. He hecho los cambios que me has indicado y ya funciona todo perfectamente. No obstante, me gustaría hacer un par de preguntas y observaciones si no te importa.


Tu Panel extiende de Canvas, debería ser de JPanel, ambos se aplica lo mismo para obtener el foco, cuando haces click obtienes el focu del panel que contiene los eventos del KeyListener dog.


¿Te importaría indicarme, aunque sea por encima, qué ventajas tiene la clase JPanel sobre la Canvas? Según tengo entendido la clase JPanel es más nueva y todo eso. Además, es cierto que con la Canvas sigue sin funcionar el asunto. Lo que sucede es que la clase JPanel creo que no la controlo demasiado. Tampoco sé lo que es un dog  :huh:

En otro ejercicio que me planteé parecido a este, si utilizaba la clase JPanel me empezaban a salir componentes como botones y cuadros de texto sobre el panel si hacía algo con ellos, cuando en un principio debían estar fuera. ¿Qué te parece?¿Sabrías decirme por qué me podía estar pasando eso? Con la Canvas no me pasaba y por eso renegué de la clase JPanel. Leeré algo más sobre la JPanel a ver si me familiarizo un poco más con ella.

Por ningun lado vi a

Código
  1. addKeyListener(this);

lo añadí en el método iniciar, entonces al darle click se habilita el KeyListener y el foco de ese Panel con

Código
  1. requestFocus();

Sí, tienes toda la razón, se me olvidó lo del addKeyListener cuando escribí el mensaje, aunque sí que lo tenía en mi código, dentro del constructor de la clase Panel.

Supongo que la clave para solucionar el problema está en lo del requestFocus(). No conocía ese método. Si lo quito los métodos de la KeyListener no se activan, por muchos 'clicks' que haga. Sin embargo, si utilizo una Canvas, es indiferente ponerlo o no ponerlo. Para que se ejecuten los métodos del KeyListener hay que hacer 'click'. ¿Sabes por qué? ¿O sabes dónde puedo encontrar información sobre todo esto? Me temo que el material que tengo es bastante corto para responderme a todas las preguntas que me surgen cuando pongo las cosas en práctica.

Por otro lado, dentro del detener:
.
Código
  1. public void detener() {
  2.    play = false;
  3.    removeKeyListener(this);
  4. }
  5.  

¿Qué hace ese removeKeyListener? ¿Es necesario? No lo había visto nunca, en mi corta experiencia en estos asuntos.

Y para finalizar, añadir que me has dado una buena idea con la modificación del windowClosing para que el programa confirme que realmente se quiere salir. Empiezo ahora también con los cuadros de diálogo. A ver si poco a poco me voy aclarando.

Y eso, que muchísimas gracias por todo, en serio. Un saludo.
9  Programación / Java / Duda manejando eventos de teclado en Java en: 11 Julio 2019, 12:26 pm
Hola.

Soy algo novato en todo esto de las interfaces gráficas y animaciones y tengo algunas dudas con un código en Java que estoy confeccionando. Necesito crear una animación controlada por cuatro teclas del teclado que empiece o se detenga cuando se aprieta un botón con el ratón.

Para eso defino utilizo una clase a la que he llamado Panel:

Código
  1. public class Panel extends Canvas implements Runnable, KeyListener{
  2.  
  3.    //Atributos:
  4.    private int ancho, alto; //el alto y el ancho del panel
  5.    private boolean play=false;//Variable que nos indica si la animación ha comenzado o no.
  6.    //... Más atributos. En general, objetos que deben ser pintados. Y variables que indican lo que
  7.    //tienen que hacer esos objetos durante la animación
  8.  
  9.    //Constructor:
  10.    public Panel(int anch, int alt)
  11.    {
  12.         ancho=anch;
  13.         alto=alt;
  14.         play=false;
  15.         //Se construyen los demás atributos
  16.    }
  17.  
  18.    public void paint (Graphics G)
  19.    {
  20.         //Aquí se pintan algunos de los atributos del objeto utilizando técnicas de doble bouffering
  21.    }
  22.  
  23.    public void update (Graphics G)
  24.    {
  25.        paint (G);
  26.    }
  27.  
  28.    public void actualizar()
  29.    {
  30.        //Nada.. Aquí se actualiza la posición de los objetos (atributos de Panel) que deben ser
  31.        //pintados durante la animación
  32.    }
  33.  
  34.    public void run()
  35.    {
  36.        while (play)
  37.        {
  38.            actualizar();
  39.            repaint();
  40.            try
  41.            {
  42.                Thread.sleep((int)espera);
  43.            }
  44.            catch (InterruptedException E)
  45.            {}
  46.            //Y más cosas que no creo que vengan a cuento.
  47.        }
  48.    }
  49.    public void Iniciar()
  50.    {
  51.        play=true;
  52.        Thread hilo=new Thread(this);
  53.        hilo.start();
  54.    }
  55.    public void Detener()
  56.    {
  57.        play=false;
  58.    }
  59.    //Metodos de KeyListener
  60.    public void keyTyped(KeyEvent e) {
  61.    }
  62.    public void keyPressed(KeyEvent e)
  63.    {
  64.        if (e.getKeyChar()=='a')
  65.        {
  66.            //Se modifican los atributos necesarios para que la animación haga lo que tiene que
  67.            //hacer cuando se pulsa una 'a'
  68.        }
  69.        if (e.getKeyChar()=='s')
  70.        {
  71.            //Lo mismo para la 's'
  72.        }
  73.        if (e.getKeyChar()=='l')
  74.        {
  75.            //...
  76.        }
  77.        if (e.getKeyChar()=='ñ')
  78.        {
  79.            //...
  80.        }
  81.    }
  82.  
  83.    @Override
  84.    public void keyReleased(KeyEvent e)
  85.    {
  86.        if (e.getKeyChar()=='a')
  87.        {
  88.            //Se modifican los atributos necesarios para que la animación haga lo que tiene que
  89.            //hacer cuando se suelta la 'a'
  90.        }
  91.        if (e.getKeyChar()=='s')
  92.        {
  93.           //...
  94.        }
  95.        if (e.getKeyChar()=='l')
  96.        {
  97.           //...
  98.        }
  99.        if (e.getKeyChar()=='ñ')
  100.        {
  101.            //...
  102.        }
  103.    }
  104.  
  105. }
  106.  

Y otra clase, la clase Juego2:

Código
  1. public class Juego2 extends JFrame implements ActionListener
  2. {
  3.    private Panel P;
  4.    private JButton boton;
  5.    private boolean play=false;
  6.    private int anchoP=900, altoP=700;
  7.  
  8.    //El constructor. No creo que tenga mucho interés para lo de mi duda pero lo pongo por si
  9.    //acaso:
  10.    public Juego2()
  11.    {
  12.        P=new Panel (anchoP,altoP);
  13.        boton=new JButton("play");
  14.        setBackground(new Color(240,240,240));
  15.        setLayout(null);        
  16.        boton.addActionListener(this);
  17.  
  18.        getContentPane().add(boton);
  19.        boton.setBounds(20,330,250,30);
  20.  
  21.        getContentPane().add(P);
  22.        P.setBounds(300, 30, anchoP, altoP);
  23.        P.setVisible(true);
  24.  
  25.        addWindowListener(new WindowAdapter(){
  26.            public void windowClosing(WindowEvent e){
  27.                System.exit(0);
  28.            }
  29.        });
  30.    }
  31.  
  32.    //el main
  33.    public static void main(String[] args) {
  34.        final Juego2 F = new Juego2();
  35.        F.setBounds(0, 0, 1300, 800);
  36.        F.setVisible(true);
  37.    }
  38.  
  39.    //El actionPerformed de la clase ActionListener
  40.    public void actionPerformed(ActionEvent e) {
  41.        if (e.getSource()==boton)
  42.        {
  43.            if (play)
  44.            {
  45.                play=false;
  46.                boton.setText("play");
  47.                P.Detener();
  48.            }
  49.            else
  50.            {
  51.                play=true;
  52.                boton.setText("pause");
  53.                P.Iniciar();
  54.            }
  55.        }
  56.    }
  57. }
  58.  

A continuación explicaré el fenómeno que me crea dudas.Cuando el código está listo hago lo siguiente:

1) Ejecuto el código. La cosa va bien, todo se construye y se visualiza correctamente.
2) Le doy al play. Y la animación comienza correctamente.
3) Le doy a una de las teclas controladoras y no ocurre nada. ¡Nada de nada!
4) Hago un 'click' de ratón sobre el panel y desde entonces ya sí funciona todo bien. El 'click' tiene que ser sobre el panel, si lo hago sobre otro punto de la ventana o fuera de ella las teclas controladoras siguen inactivas.

¿Alguien sabe por qué pasa esto y cómo puedo solucionarlo? Es decir, me gustaría que las teclas controladoras funcionasen desde que le doy al play, que no fuese necesario hacer ese 'click'.

Muchas gracias de antemano por vuestro tiempo. Un saludo.
10  Programación / Java / Re: Simulación gráfica animada en: 7 Julio 2019, 17:26 pm
Hola NEBIRE.

Vale sí, claro, claro, lo entiendo, lo entiendo. Muy interesante esto de empezar pensando si el acceso es síncrono o aleatorio para usar una lista enlazada o un array, sobre todo si la dimensión de la estructura puede hacerse muy grande. Aquí, en principio no quería utilizar el programilla este para simular una situación con un gran número de bolas, así que creo que lo voy a dejar así, de momento, pero gracias por el consejo. Lo tendré en cuenta para futuras batallas.  ;)

Un saludo.
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines