2012-03-01 10 views
12

Estoy tratando de mostrar varias imágenes en sugerencia de un componente, que se encuentra createToolTip() e implementado una costumbre que añade los componentes necesarios como esto:punta de la herramienta Java personalizado con componentes Swing como el contenido no aparece

setComponent(component); 

JPanel images = new JPanel(null); 
images.setLayout(new BoxLayout(images, BoxLayout.X_AXIS)); 
for(ImageIcon icon:myIcons) { 
    images.add(new JLabel(icon)); 
} 

JPanel content = new JPanel(new BorderLayout()); 
content.add(new JLabel(title), BorderLayout.NORTH); 
content.add(new JLabel(description)); 
content.add(images, BorderLayout.SOUTH); 

add(content); 

Sin embargo, todo lo que veo es un pequeño punto, que indica que se muestra la punta de la herramienta, pero de alguna manera se ignora el tamaño. ¿Qué extraño la implementación de una información sobre herramientas personalizada?

+0

Estoy publicando esta pregunta después de haberlo resuelto. No estoy seguro de qué tan buena o mala manera es publicar en una situación así, pero como ni The Tutorial de Java ni Stack Overflow lo explican en este momento, quería compartir mis resultados. Si esto es bueno o malo para mí, me gustaría que se me enseñe educadamente mejor;) –

+2

buena pregunta con un excelente seguimiento :-) Solo algunos enlaces que pueden ser interesantes: https://forums.oracle. com/forums/thread.jspa? threadID = 2128796 - vea mi último comentario sobre por qué el delegado de ui ignora el LayoutManager – kleopatra

Respuesta

11

Las bases son "problemas" que JToolTip

  • -no es diseñado como un contenedor, es sólo accidentalmente un recipiente porque es JComponent. Para un Swing "no contenedor" es responsabilidad del delegado ui actuar como LayoutManager.
  • no es lo suficientemente rico, que puede manejar sólo texto (al menos con el html puerta de emergencia, que es @ :-) favorita de Andrew

pasando por alto esas limitaciones, básicamente, es una conducción que casi Widget sobre el borde. Una solución limpia rodaría un nuevo componente ... Por otro lado, el OP ya encontró los tornillos para ajustar. Lo único que podría mejorarse ligeramente es no llamar a setXXSize ni establecer un ui personalizado. En su lugar, hacer que se comporte como un envase anulando getXXSize() como:

@Override 
public Dimension getPreferredSize() { 
    if (getLayout() != null) { 
     return getLayout().preferredLayoutSize(this); 
    } 
    return super.getPreferredSize(); 
} 
+2

¡Genial! Agregué '! IsPreferredSizeSet ​​()' a la condición y ahora estoy usando esta variante. –

+0

Y veo cómo el JToolTip no está diseñado para hacer esto, pero no entiendo muy bien por qué. Según lo veo, la información sobre herramientas explica un componente, pero incluso puede proporcionar información adicional: Puedo ver en el icono de la barra de herramientas que el botón imprime el documento, pero la información sobre herramientas también me dice que el asesor es Ctrl + P. Frente a eso, la información sobre herramientas puede mejorar legítimamente el significado de un componente, limitarlo al texto es seguramente histórico. (Solo quería sacar eso, no hay necesidad de discutir una pregunta "filosófica" aquí;)) –

+1

+1, esta respuesta me llevó de vuelta a Tutoriales Swing, parece que extrañé demasiado, leyendo esta respuesta :-) –

3

Puede sonar tonto pero, ¿ha intentado establecer límites para JPanel?

setBounds(100, 100, 150, 50); 

Y usted puede intentar setting a gap between components en BorderLayout

JPanel content = new JPanel(new BorderLayout(1,1)); 
+0

sorta; ver mi próxima respuesta en unos minutos;) desafortunadamente, hay algunas advertencias que hacen que los tooltips personalizados sean extraños de implementar, incluso con la experiencia swing –

+0

@SillyFreak Bueno, es Swing. Puedes esperar cualquier cosa en cualquier momento. –

+1

+1 esta podría ser la dirección correcta, [no es tonto] (http://stackoverflow.com/a/5957405/714968) – mKorbel

4

me gustaría sugerir que el uso de JWindow o un_decorated JDialog, como ventana emergente (utilizado por defecto para JCalendar o JDatePicker) en lugar de JTooltip, por más bonito salida a la GUI implementa Translucent and Shaped Windows

+1

El enlace está desactualizado. Candidatos del sitio: [enlace] (https://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html) [enlace] (http://www.oracle.com/technetwork/articles/java /translucent-shaped-windows-139324.html), y en caso de que vuelvan a moverse: [enlace de Google] (https://www.google.com/search?q=site%3Aoracle.com+translucent+and+shaped+ Windows) –

+0

"EDITAR": Acabo de tomar la fuente de transparencia de Oracle y agregué la parte de fuente de forma, por lo que tiene ambas en una breve clase de demostración: http://pastebin.com/pcPArzRH –

13

Las sugerencias de herramientas pueden representar HTML. Si puede formar URL para las imágenes (no es práctico si se generan en la memoria pero normalmente son factibles), es fácil escribir algo de HTML que cargue las imágenes y usar ese HTML como información sobre herramientas.


E.G.

MultiIconToolTip

import javax.swing.*; 

class MultiIconToolTip { 

    public static void main(String[] args) throws Exception { 
     final String html = 
      "<html><body>" + 
      "<img src='" + 
      "http://i.stack.imgur.com/OVOg3.jpg" + 
      "' width=160 height=120> " + 
      "<img src='" + 
      "http://i.stack.imgur.com/lxthA.jpg" + 
      "' width=160 height=120>" + 
      "<p>Look Ma, no hands!"; 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JLabel hover = new JLabel("Point at me!"); 
       hover.setToolTipText(html); 
       JOptionPane.showMessageDialog(null, hover); 
      } 
     }); 
    } 
} 
+0

¡Esta es una buena idea! No lo he probado, pero supongo que debería funcionar con las URL de ClassLoader.getResource(), también –

+0

Sí, las URL que apuntan a la ruta de clase funcionan bien. De hecho, es mejor que llegar a mi sitio, ya que la ventana emergente aparece más rápido. –

3

Fundamentalmente, hay dos cosas que faltan. En primer lugar, JToolTip se extiende JComponent, y a diferencia de JPanel, no tiene un diseño predeterminado. Para estirar el content a través de la información sobre herramientas, use un BorderLayout.

setLayout(new BorderLayout()); 

El segundo problema es el tamaño. El ToolTipManager respeta el tamaño preferido de la punta de la herramienta. Mientras que BorderLayout calcula el tamaño, ToolTipUI lo ignora. Entonces, hay dos alternativas: establecer manualmente el tamaño preferido ...

setPreferredSize(content.getPreferredSize()); 

Tenga en cuenta que esto no hace que el diseño sea obsoleto; de lo contrario, obtendrá una sugerencia de herramienta vacía con el tamaño correcto.

... o la subclase ToolTipUI para respetar el diseño, que es lo que fui con. El código resultante es:

setComponent(StadtLabel.this); 

JPanel images = new JPanel(null); 
waren.setLayout(new BoxLayout(waren, BoxLayout.X_AXIS)); 
for(ImageIcon icon:myIcons) { 
    JLabel lbl = new JLabel(icon); 
} 

JPanel content = new JPanel(new BorderLayout()); 
content.add(new JLabel(title), BorderLayout.NORTH); 
content.add(new JLabel(description)); 
content.add(images, BorderLayout.SOUTH); 

setLayout(new BorderLayout()); 
add(content); 
setUI(new ToolTipUI() { 
    @Override 
    public Dimension getMinimumSize(JComponent c) { 
     return c.getLayout().minimumLayoutSize(c); 
    } 

    @Override 
    public Dimension getPreferredSize(JComponent c) { 
     return c.getLayout().preferredLayoutSize(c); 
    } 

    @Override 
    public Dimension getMaximumSize(JComponent c) { 
     return getPreferredSize(c); 
    } 
}); 
0

vez de reinventar la rueda intente esto: https://github.com/timmolderez/balloontip. Puede poner cualquier contenido como JComponent.

+1

Con la desaparición de java.net, creo que BalloonTip ahora está en [github] (https://github.com/timmolderez/balloontip). – Pixelstix

Cuestiones relacionadas