es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué JComboBox ejecuta la función toString() al pasar el ratón por encima?

He creado una interfaz gráfica de usuario (GUI) simple, con un JComboBox y un JButton. El JButton rellena el JComboBox con objetos de la clase testString. Cuando se pasa el mouse sobre el JComboBox, se llama al método toString() de la clase testString aproximadamente 25 veces. ¿Por qué ocurre esto? ¿Cómo podemos detenerlo?

Aquí está el código:

import javax.swing.DefaultComboBoxModel;

public class _NewJFrame extends javax.swing.JFrame {

    public _NewJFrame() {
        initComponents();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Object[] args = {new testString("ABC") , new testString("EDF") , "GIH", "IJK"}; 
        jComboBox1.setModel(new DefaultComboBoxModel(args ));
    }                                        

    public static void main(String args[]) {
        new _NewJFrame().setVisible(true);
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JComboBox<string> jComboBox1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
}

class testString {
    String text; 
    static int i; 

    testString(String text){ 
        this.text = text; 
    }; 

    public String toString(){
        System.out.println("ToSting() llamado en Texto " + text + " "+ ++i);
        return text; 
    }
}

GUI: enlace a la imagen
Resultado: enlace a la imagen

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema está en la implementación del método toString() en la clase testString. Cada vez que se pasa el cursor sobre el JComboBox, se llama al método toString() y se imprime el mensaje en la consola. Como resultado, se llama 25 veces, lo que causa un problema de rendimiento.

    Para solucionar esto, puedes eliminar la instrucción System.out.println del método toString(). Si necesitas imprimir el mensaje con fines de depuración, puedes utilizar registradores en su lugar.

    Aquí está el código modificado para la clase testString sin la instrucción System.out.println.

    class testString {
        String text; 
        static int i; 
    
        testString(String text){ 
            this.text = text; 
        }
    
        @Override
        public String toString(){
            return text; 
        }
    }
    

    Con esta modificación, el método toString() se llamará solo una vez cada vez que se agregue un elemento al JComboBox, en lugar de llamarlo varias veces al pasar el cursor sobre él.

Comments are closed.