Dado un JTextField (o cualquier JComponent para el caso), ¿cómo se podría ir sobre la obligando a que el componente designado del tooltip a aparecer, sin ningún daño directo de eventos de entrada del usuario? En otras palabras, ¿por qué no hay JComponent.setTooltipVisible(boolean)?

Quieres decir que te deseo para la descripción de la continua visible? Porque no es eso lo que la información sobre herramientas se utilizan para…

OriginalEl autor Joseph | 2011-06-24

5 Comentarios

  1. 5

    La única manera (además de crear su propia ventana de información sobre herramientas) que he encontrado es emmulate la combinación de teclas CTRL+F1 tecla en foco:

    new FocusAdapter()
    {
        @Override
        public void focusGained(FocusEvent e)
        {
            try
            {
                KeyEvent ke = new KeyEvent(e.getComponent(), KeyEvent.KEY_PRESSED,
                        System.currentTimeMillis(), InputEvent.CTRL_MASK,
                        KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED);
                e.getComponent().dispatchEvent(ke);
            }
            catch (Throwable e1)
            {e1.printStackTrace();}
        }
    }

    Por desgracia, la descripción va a desaparecer tan pronto como usted mueva su ratón (fuera de la componente) o después de un retraso (ver ToolTipManager.setDismissDelay).

    +1, mi sugerencia original estaba basado en la tecla F1 invocando la “postTip” de Acción. Pensé que era más limpio para invocar la Acción directamente, en lugar de enviar el KeyEvent. No sé por qué no funciona más.
    los tooltips son muy mal implementado en java de la omi. muy inflexibles. que tal hacks son necesarios (y casi no lograr lo que se necesita) muestran que la api es insuficiente.
    Es Ctrl+F1 independiente de la plataforma? Debo esperar a que trabajo en un Mac al igual que en Windows?
    muy posiblemente no! publica tu solución si usted encuentra uno… @NickMiller

    OriginalEl autor pstanton

  2. 4

    Necesario para invocar a la Acción predeterminada para mostrar la descripción. Por ejemplo, para mostrar una información sobre herramientas cuando un componente recibe el foco puede agregar la siguiente FocusListener para el componente:

    FocusAdapter focusAdapter = new FocusAdapter()
    {
        public void focusGained(FocusEvent e)
        {
            JComponent component = (JComponent)e.getSource();
            Action toolTipAction = component.getActionMap().get("postTip");
    
            if (toolTipAction != null)
            {
                ActionEvent postTip = new ActionEvent(component, ActionEvent.ACTION_PERFORMED, "");
                toolTipAction.actionPerformed( postTip );
            }
    
        }
    };

    Edición:

    El código anterior no parece funcionar. Otro enfoque es el envío de un MouseEvent para el componente:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class PostTipSSCCE extends JPanel
    {
    public PostTipSSCCE()
    {
    FocusAdapter fa = new FocusAdapter()
    {
    public void focusGained(FocusEvent e)
    {
    JComponent component = (JComponent)e.getSource();
    MouseEvent phantom = new MouseEvent(
    component,
    MouseEvent.MOUSE_MOVED,
    System.currentTimeMillis(),
    0,
    10,
    10,
    0,
    false);
    ToolTipManager.sharedInstance().mouseMoved(phantom);
    }
    };
    JButton button = new JButton("Button");
    button.setToolTipText("button tool tip");
    button.addFocusListener( fa );
    add( button );
    JTextField textField = new JTextField(10);
    textField.setToolTipText("text field tool tip");
    textField.addFocusListener( fa );
    add( textField );
    JCheckBox checkBox =  new JCheckBox("CheckBox");
    checkBox.setToolTipText("checkbox tool tip");
    checkBox.addFocusListener( fa );
    add( checkBox );
    }
    private static void createAndShowUI()
    {
    JFrame frame = new JFrame("PostTipSSCCE");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add( new JScrollPane(new PostTipSSCCE()) );
    frame.pack();
    frame.setLocationByPlatform( true );
    frame.setVisible( true );
    }
    public static void main(String[] args)
    {
    EventQueue.invokeLater(new Runnable()
    {
    public void run()
    {
    createAndShowUI();
    }
    });
    }
    }

    Este enfoque resultará en una pequeña demora antes de que la descripción se muestra como se simularon el ratón entre el componente. Para la visualización inmediata de la información sobre herramientas puede utilizar pstanton la solución.

    Tenga en cuenta que con este código, la posición de la descripción no se especifica, y lo más probable es que no sea bajo el cursor del ratón
    toolTipAction es nulo para mi JButton. ¿Por qué es eso?
    esto no funciona, component.getActionMap().get("postTip"); devuelve null para JTextField
    hmmm, devuelve null para todos los componentes de ahora. De todos modos, me ofreció una sugerencia alternativa.
    Usted puede utilizar TooltipManager.sharedInstance().setInitialDelay() para mostrar el tooltip al instante con un valor de 0.

    OriginalEl autor camickr

  3. 2

    Para mí funciona la versión similar se indicó anteriormente (en lugar de Temporizador he utilizado SwingUtilities y invokeLater enfoque):

    private void showTooltip(Component component)
    {
    final ToolTipManager ttm = ToolTipManager.sharedInstance();
    final int oldDelay = ttm.getInitialDelay();
    ttm.setInitialDelay(0);
    ttm.mouseMoved(new MouseEvent(component, 0, 0, 0,
    0, 0, //X-Y of the mouse for the tool tip
    0, false));
    SwingUtilities.invokeLater(new Runnable()
    {
    @Override
    public void run() 
    {
    ttm.setInitialDelay(oldDelay);
    }
    });
    }

    OriginalEl autor Jan Trembulak

  4. 0

    Puede acceder a la ToolTipManager, establecer el retardo inicial a 0 y enviar un evento. No olvides que restaurar los valores después.

    private void displayToolTip()
    {
    final ToolTipManager ttm = ToolTipManager.sharedInstance();
    final MouseEvent event = new MouseEvent(this, 0, 0, 0,
    0, 0, //X-Y of the mouse for the tool tip
    0, false);
    final int oldDelay = ttm.getInitialDelay();
    final String oldText = textPane.getToolTipText(event);
    textPane.setToolTipText("<html><a href='http://www.google.com'>google</a></html>!");
    ttm.setInitialDelay(0);
    ttm.setDismissDelay(1000);
    ttm.mouseMoved(event);
    new Timer().schedule(new TimerTask()
    {
    @Override
    public void run()
    {
    ttm.setInitialDelay(oldDelay);
    textPane.setToolTipText(oldText);
    }
    }, ttm.getDismissDelay());
    }

    OriginalEl autor Olivier Faucheux

  5. 0

    No es un ToolTip, pero se puede utilizar un balón en la punta:
    http://timmolderez.be/balloontip/doku.php

    Se muestra en la convocatoria y se siente mejor en algunos momentos, luego Defecto ToolTip

    Tenga en cuenta que a diferencia de la información de herramientas, estos globos no puede salir de la ventana que contiene el objetivo de componente.

    OriginalEl autor bench_doos

Dejar respuesta

Please enter your comment!
Please enter your name here