2010-03-25 28 views
5

Hola ¿es posible colocar un icono en el título de un TitledBorder por ejemplo, el siguiente código:icono en el título TitledBorder


import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.TitledBorder; 

public class TitledExample extends JPanel { 

    public TitledExample() { 
    super(true); 

    this.setLayout(new GridLayout(1, 1, 5, 5)); 

    JLabel label = new JLabel("Titled Border"); 
    label.setHorizontalAlignment(JLabel.CENTER); 

    TitledBorder titled = new TitledBorder("Image here ?? Title"); 
    label.setBorder(titled); 

    add(label); 
    } 

Gracias, Saludos

+0

Tengo una necesidad de hacer algo como esto si fuera posible. Los requisitos para un título personalizado son Java String. En mi caso, al menos, necesito dejar espacios para usar el enfoque @rhu. Alternativamente, una persona puede crear su propia fábrica de bordes y hacer un borde con una etiqueta de icono y una etiqueta de título (texto). No estoy seguro de si tendré tiempo para hacer eso. – will

Respuesta

5

Probablemente no es lo que quieres, pero tal vez un buen Unicode™ glyph o dos harían.

Adición: @rhu's approach es preferible, pero no pude resistir a probar esto:

enter image description here

TitledBorder titled = BorderFactory.createTitledBorder("\u2615"); 
titled.setTitleFont(new Font(Font.Dialog, Font.PLAIN, 32)); 
titled.setTitleColor(Color.blue); 
label.setBorder(titled); 
+0

usé tu código pero no funciona para mí ... cuando creaste unTitledBorder ("\ u2615"); coloque el nombre del icono en el directorio principal, cuando coloque la ruta del icono, la ruta aparece en el borde del título en lugar del icono – BDeveloper

+0

@BDeveloper: el parámetro para 'createTitledBorder()' no es un ícono; es un 'String' que contiene el [escape Unicode] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.3) para el punto de código [' HOT BEBIDAS (U + 2615) '] (http://www.fileformat.info/info/unicode/char/2615/index.htm). – trashgod

+0

_btw_ Diálogo funcionó para mí cuando Tahoma me decepcionó. – will

8

Trate de subclases TitledBorder, y anular el método paintBorder:

@Overide 
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) 
{ 
    super.paintBorder(c, g, x, y, width, height); 

    // Now use the graphics context to draw whatever needed 
    g.drawImage(img, xImageOffset, yImageOffset, imgWidth, imgHeight, observer); 
} 
No

desesperadamente Seguro que esta es una llamada a método completamente correcta, pero entiendes la idea; una vez que tenga acceso al objeto Graphics, podrá pintar prácticamente todo lo que necesite.

0

TitledBorder utiliza una etiqueta JLabel para pintar el texto en el borde. Desafortunadamente, el JLabel es un campo privado. Hay dos formas de agregar el icono:

  • el acceso al campo JLabel privada, y establecer el icono de la JLabel.

  • subclase TitledBorder y vuelva a implementar el método paintBorder. Me gustaría
    probablemente también agregue un constructor que toma un JLabel por lo que uno puede
    controlar lo que está pintado en el borde.

1

Puede usar el reflejo para obtener acceso al JLabel utilizado por TitledBorder.

try 
{ 
    // Get the field declaration 
    Field f = TitledBorder.class.getDeclaredField("label"); 
    // Make it accessible (it normally is private) 
    f.setAccessible(true); 
    // Get the label 
    JLabel borderLabel = (JLabel)f.get(titledBorder); 
    // Put the field accessibility back to default 
    f.setAccessible(false); 
    // Set the icon and do whatever you want with your label 
    borderLabel.setIcon(myIcon); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

Es importante tener en cuenta que esto no va a funcionar en Java 10, ya que tendrá reglas más estrictas sobre el uso de setAccessible

Cuestiones relacionadas