Hay algo ahí fuera que le permite mostrar un pequeño texto de la ventana emergente (como una información sobre herramientas) a través de palabras individuales o letras en un Columpio JTextArea? (O un JTextArea alternativa con una funcionalidad similar.)

Lo que necesito debería comportarse como una descripción, en otras palabras, sólo se mostrará en la ventana de texto después de que el ratón se ha mantenido por encima de la palabra para un segundo o dos, y desaparecerían automáticamente una vez que se mueve el ratón de distancia. Por supuesto, el truco aquí es que quiero que en el carácter/a nivel de palabra dentro del texto, no en el nivel de componente… alguna sugerencia?

  • y @camickr lo dijo todo 🙂 El único pequeño nastyness es el Swing de sí mismo: la aplicación dependen de la ubicación tooltips requiere la creación de subclases. Eso es un pequeño precio a pagar, en comparación con el rodar de su propia WhateverHoverManager
InformationsquelleAutor Manius | 2011-05-10

5 Comentarios

  1. 22

    Puede reemplazar getToolTipText(Evento de Ratón evento) como sea necesario.

    Anexo: JTextComponent, el padre de JTextArea proporciona información de ubicación a través de dos métodos: modelToView() y viewToModel(). El última debe dejar de traducir la ubicación del ratón en un documento de desplazamiento.

    • +1 por simplicidad.
    • trashgod +1, pero sé someComponet.dispatchEvent(SwingUtilities.convertMouseEvent(..) a partir de Representador pero, ¿cómo hacer con el TextArea + símbolo de Intercalación
    • Buena pregunta. Yo creo la ubicación de la información en JTextComponent es suficiente. Para la referencia, he actualizado el enlace a JTextComponent#getToolTipText(), lo que invalida que en JComponent.
    • significado ¿qué? Como a menudo, entiendo tus palabras (tomado de uno en uno), pero no su combinación 😉
    • Tengo problema similar, me pasó por encima getToolTipText(MouseEvent event) en mi JTextArea pero no recibir llamadas. Algún consejo?
    • Invocar setToolTipText() con un valor predeterminado para inicializar el ToolTipManager.

  2. 10

    tal vez

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.font.*;
    import java.awt.geom.*;
    import javax.swing.*;
    import java.util.*;
    import javax.swing.event.*;
    public class SimplePaintSurface implements Runnable, ActionListener {
    private static final int WIDTH = 1250;
    private static final int HEIGHT = 800;
    private Random random = new Random();
    private JFrame frame = new JFrame("SimplePaintSurface");
    private JPanel tableaux;
    @Override
    public void run() {
    tableaux = new JPanel(null);
    for (int i = 1500; --i >= 0;) {
    addRandom();
    }
    frame.add(tableaux, BorderLayout.CENTER);
    JButton add = new JButton("Add");
    add.addActionListener(this);
    frame.add(add, BorderLayout.SOUTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    tableaux.requestFocusInWindow();
    }
    @Override
    public void actionPerformed(final ActionEvent e) {
    addRandom();
    tableaux.repaint();
    }
    void addRandom() {
    Letter letter = new Letter(Character.toString((char) ('a' + random.nextInt(26))));
    letter.setBounds(random.nextInt(WIDTH), random.nextInt(HEIGHT), 16, 16);
    tableaux.add(letter);
    }
    public static void main(final String[] args) {
    SwingUtilities.invokeLater(new SimplePaintSurface());
    }
    }
    class Letter extends JLabel {
    private Font font1;
    private Font font2;
    private final FontRenderContext fontRenderContext1;
    private final FontRenderContext fontRenderContext2;
    public Letter(final String letter) {
    super(letter);
    setFocusable(true);
    setBackground(Color.RED);
    font1 = getFont();
    font2 = font1.deriveFont(48f);
    fontRenderContext1 = getFontMetrics(font1).getFontRenderContext();
    fontRenderContext2 = getFontMetrics(font2).getFontRenderContext();
    MouseInputAdapter mouseHandler = new MouseInputAdapter() {
    @Override
    public void mouseEntered(final MouseEvent e) {
    Letter.this.setOpaque(true);
    setFont(font2);
    Rectangle bounds = getBounds();
    Rectangle2D stringBounds = font2.getStringBounds(getText(), fontRenderContext2);
    bounds.width = (int) stringBounds.getWidth();
    bounds.height = (int) stringBounds.getHeight();
    setBounds(bounds);
    }
    @Override
    public void mouseExited(final MouseEvent e) {
    Letter.this.setOpaque(false);
    setFont(font1);
    Rectangle bounds = getBounds();
    Rectangle2D stringBounds = font1.getStringBounds(getText(), fontRenderContext1);
    bounds.width = (int) stringBounds.getWidth();
    bounds.height = (int) stringBounds.getHeight();
    setBounds(bounds);
    }
    };
    addMouseListener(mouseHandler);
    }
    }
    • +1 para un tour de force!
    • te gusta el azar fragmento de código 🙂
  3. 10

    Por supuesto, el truco aquí es que quiero que en el carácter/a nivel de palabra dentro del texto

    Utiliza el ratón para determinar dónde usted está en el área de texto:

    int offset = textArea.viewToModel(...);

    Ahora que usted tiene un desplazamiento que puede obtener el carácter o palabra en esa ubicación. Las Utilidades de la clase tiene métodos como getWordStart() y getWordEnd().

    A continuación, utilizar la getText(…) el método para obtener la palabra o el carácter.

    • +1 Gracias por la comprobación de este. Yo estaba seguro de cuando yo le comenté a @mKorbel, y he pasado por alto inadvertidamente su respuesta cuando he actualizado mine.
  4. 1

    Aquí es una implementación real construido en @trashgods y @camickr respuesta:

    con

    addToolTip(line,toolTip) 

    usted puede agregar una descripción de una línea específica que se mostrará al pasar el cursor sobre la línea. Puede establecer debug=true para obtener una descripción de la herramienta de visualización para cada ubicación.

    si quieres mostrar un general de la punta de la herramienta de líneas que no han específica es posible que desee agregar con

    addToolTip(-1,"general tool tip").

    Esta solución no es 100% lo que se le pidió, pero bastante cerca. Con algunos retoques se debe obtener la originalmente quería resultado.

    Código Fuente:

    package com.bitplan.swingutil;
    import java.awt.event.MouseEvent;
    import java.util.HashMap;
    import java.util.Map;
    import javax.swing.JTextArea;
    import javax.swing.text.BadLocationException;
    /**
    * Answer for 
    * http://stackoverflow.com/questions/5957241/text-mouseover-popups-over-a-swing-jtextarea/35250911#35250911
    * 
    * see http://stackoverflow.com/a/35250911/1497139
    * a JTextArea that shows the current Position of the mouse as a tooltip
    * @author wf
    *
    */
    public class JToolTipEventTextArea extends JTextArea {
    //make sure Eclipse doesn't show a warning
    private static final long serialVersionUID = 1L;
    //switch to display debugging tooltip
    boolean debug=false;
    /**
    * the map of tool tips per line
    */
    public Map<Integer,String> lineToolTips=new HashMap<Integer,String>();
    /**
    * create me with the given rows and columns
    * @param rows
    * @param cols
    */
    public JToolTipEventTextArea(int rows, int cols) {
    super(rows,cols);
    //initialize the tool tip event handling
    this.setToolTipText("");
    }
    /**
    * add a tool tip for the given line
    * @param line - the line number
    * @param tooltip - 
    */
    public void addToolTip(int line,String tooltip) {
    lineToolTips.put(line,tooltip);
    }
    /**
    * get the ToolTipText for the given mouse event
    * @param event - the mouse event to handle
    */
    public String getToolTipText(MouseEvent event) {
    //convert the mouse position to a model position
    int viewToModel =viewToModel(event.getPoint());
    //use -1 if we do not find a line number later
    int lineNo=-1;
    //debug information
    String line=" line ?";
    //did we get a valid view to model position?
    if(viewToModel != -1){
    try {
    //convert the modelPosition to a line number
    lineNo = this.getLineOfOffset(viewToModel)+1;
    //set the debug info
    line=" line "+lineNo;
    } catch (BadLocationException ble) {
    //in case the line number is invalid ignore this 
    //in debug mode show the issue 
    line=ble.getMessage();
    }
    }
    //try to lookup the tool tip - will be null if the line number is invalid
    //if you want to show a general tool tip for invalid lines you might want to
    //add it with addToolTip(-1,"general tool tip")
    String toolTip=this.lineToolTips.get(lineNo);
    //if in debug mode show some info
    if (debug)  {
    //different display whether we found a tooltip or not
    if (toolTip==null) {
    toolTip="no tooltip for line "+lineNo;
    } else {
    toolTip="tooltip: "+toolTip+" for line "+lineNo;
    }
    //generally we add the position info for debugging
    toolTip+=String.format(" at %3d /%3d ",event.getX(),event.getY());
    } 
    //now return the tool tip as wanted
    return toolTip;
    }
    }
  5. 0

    Que suena complicado. Esto es sólo la parte superior de mi cabeza y probablemente no vote. Pero usted podría ser capaz de hacer esto.

    Suponiendo que hay algún tipo de HoverListener o algo que se puede aplicar, o de lo contrario tendrá que implementar un detector de ratón y construir en su propio temporizador de espera. Pero una vez aquí, a un punto donde usted sabe que usted desea mostrar una descripción, sólo que no sé qué letra/palabra la que se encuentran. Estoy bastante seguro de que a pesar de que es posible obtener la posición del cursor en la pantalla. A continuación, el uso de esta posición, usted podría ser capaz de calcular la posición del cursor estaba en el interior de la caja de texto y, a continuación, usted puede tomar el personaje. Una vez que tenga el carácter/ubicación puede también tomar la palabra entera demasiado sin mucho más trabajo. (Tenga en cuenta que usted desea conseguir el «viewport» del área de texto a la hora de calcular lo que el cursor se movía más, si su área de texto tiene barras de desplazamiento de la ventana gráfica se representan únicamente la zona visible en la pantalla)

    Lo siento por la muy prolijo respuesta, pero esa es la lógica general me gustaría probar si TENÍA que tener esta funcionalidad y sé Swing no lo ofrecen. Esperemos que se hace un punto de partida decente.

    • habría que añadir un MouseMotionListener para el JTextArea. pero getToolTipText es mucho más simple.
    • reemplazar la propiedad toolTipText es más simple, pero el uso de la MouseMotionListener creo que podría pasar a la ubicación del cursor en su caso args, pero así podría toolTipText. Su sólo una cuestión de ver qué hay por ahí y cuál es disponible, supongo. Como he dicho, yo no tenía la esperanza de todos los votos, pero me gusta ofrecer algo al menos para estimular los jugos creativos en otras personas.
    • tal vez va a ser votado, hacia abajo … la Creatividad es buena, pero se desperdicia en simplemente re-inventar la rueda. Sólo si usted sale con una increíblemente mejorada de la rueda al final del día, usted va a obtener la alabanza. Condición previa para que el éxito es una en-y-fuera de un profundo conocimiento de la ya existente rueda simple y sus limitaciones (si las hubiere) … meras suposiciones no va a ayudar. Fin del sermón 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here