usar icon ejemplo codigo java html swing graphics2d jcomponent

icon - jlabel java ejemplo



Swing HTML drawString (7)

Intento crear algún componente especial para un propósito específico, en ese componente necesito dibujar una cadena HTML, aquí hay un código de muestra:

public class MyComponent extends JComponent{ public MyComponent(){ super(); } protected void paintComponent(Graphics g){ //some drawing operations... g.drawString("<html><u>text to render</u></html>",10,10); } }

Desafortunadamente, el método drawString parece no reconocer el formato HTML, dibuja tontamente la cadena tal como es.

¿Hay alguna manera de hacer que funcione?


He encontrado una manera breve y limpia de simular el paintHtmlString ; aquí está el código:

public class MyComponent extends JComponent { private JLabel label = null; public MyComponent() { super(); } private JLabel getLabel() { if (label == null) { label = new JLabel(); } return label; } /** * x and y stand for the upper left corner of the label * and not for the baseline coordinates ... */ private void paintHtmlString(Graphics g, String html, int x, int y) { g.translate(x, y); getLabel().setText(html); //the fontMetrics stringWidth and height can be replaced by //getLabel().getPreferredSize() if needed getLabel().paint(g); g.translate(-x, -y); } protected void paintComponent(Graphics g) { //some drawing operations... paintHtmlString(g, "<html><u>some text</u></html>", 10, 10); } }

Gracias a todos por la ayuda, lo aprecio mucho.


Esta no es la forma de implementarlo.

El drawString(String str, int x, int y) solo dibuja el texto dado por la cadena especificada, utilizando la fuente y el color actuales de este contexto de gráficos.

Puede obtener más información sobre su problema aquí, Cómo usar HTML en Swing Components


La respuesta a su pregunta es que HTML no es compatible.

La solución más fácil es usar componentes Swing y colocarlos de manera adecuada.

Si quieres hacerlo tú mismo, entonces necesitas manipular la Fuente que usas para el método drawString (). Puede usar una fuente con cursiva, negrita, etc.


No hay una manera fácil de renderizar HTML para pintar con Graphics, vaya con un JLabel.

Sin embargo, hay una manera interesante de lograr esto creando un JLabel con HTML y pintando sus gráficos para el componente:

private JLabel label; public MyComponent() { label = new JLabel("Before Red"); label.setText("<html><u>test</u></html>"); this.add(label); } public void repaint(Graphics g){ g = label.getGraphics(); }

La manera más fácil de lograr esto sería establecer una fuente para sus gráficos, por ejemplo:

public void repaint(Graphics g){ Font f = new Font("Courier", Font.BOLD, 12); g.setFont(f); g.drawString("Bolded Courier", 5, 15); }


Usa JLabel como tu clase base. Graphics.drawString() solo puede ... dibujar una cadena.


Si es fan de Java2D; pero para aprovechar al máximo el HTML en los componentes y diseños de Swing, te animo a que uses el enfoque de componentes sugerido por @camickr. Si es necesario, puede usar el enfoque de renderizador de peso mosca visto en JTable , et al , en el que se usa un solo componente repetidamente para dibujar. El siguiente ejemplo es un esquema muy simplificado de la técnica, cambiando solo el color y la ubicación.

Adición: ejemplo actualizado; vea también CellRendererPane y haga volar sus aplicaciones: Implemente Flyweight para mejorar el rendimiento .

import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import javax.swing.CellRendererPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /** @see http://.com/questions/7774960 */ public class PaintComponentTest extends JPanel { private static final int N = 8; private static final String s = "<html><big><u>Hello</u></html>"; private JLabel renderer = new JLabel(s); private CellRendererPane crp = new CellRendererPane(); private Dimension dim; public PaintComponentTest() { this.setBackground(Color.black); dim = renderer.getPreferredSize(); this.add(crp); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < N; i++) { renderer.setForeground(Color.getHSBColor((float) i / N, 1, 1)); crp.paintComponent(g, renderer, this, i * dim.width, i * dim.height, dim.width, dim.height); } } private void display() { JFrame f = new JFrame("PaintComponentTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setSize(dim.width * N, dim.height * (N + 1)); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new PaintComponentTest().display(); } }); } }


Como otros han comentado, los componentes Swing admiten HTML 3.2 y estilos básicos.

Para obtener detalles sobre cómo aprovechar esa capacidad en el paintComponent(Graphics) , consulte la fuente LabelRenderTest.java en este hilo .

El enfoque es renderizar la etiqueta en una imagen y luego renderizarla en el objeto Graphics .