2012-08-28 26 views
5

Estoy tratando de extender el StyledEditorKit en Swing para poder incluir un JLabel dentro del editor. Pude hacer eso y esto es lo que obtuve hasta ahora. En la imagen siguiente, el botón del texto resaltado es del tipo JLabel mientras que el resto del texto es texto normal.¿Cómo agregar JLabel a JEditorPane?

enter image description here

Como se puede ver la etiqueta rinde un poco por debajo que el texto normal. ¿Cómo alineo su parte superior con la parte superior del texto restante?

Este es el código para la vista que se utiliza para crear este elemento etiqueta:

class ComponentView(Element elem) { 
     @Override 
     protected Component createComponent() { 
     JLabel lbl = new JLabel(""); 
     lbl.setOpaque(true); 
     lbl.setBackground(Color.red); 
     try { 
       int start = getElement().getStartOffset(); 
       int end = getElement().getEndOffset(); 
       String text = getElement().getDocument().getText(start, end - start); 
       lbl.setText(text); 
     } catch (BadLocationException e) {} 
     return lbl; 
     } 
} 

Respuesta

5

intente ajustar Component.getAlignmentY que controla el posicionamiento del componente con relación a la línea base del texto como se sugiere en ComponentView.

También podría intentar usar JTextPane que proporciona una compatibilidad más fácil para los componentes integrados. Los componentes se pueden agregar usando el método insertComponent(). Aquí hay un ejemplo, también demos setAlignmentY:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 

public class TextPaneDemo { 
    private static void createAndShowGUI() { 
     final JTextPane pane = new JTextPane(); 
     pane.setText("Some text"); 

     JButton buttonButton = new JButton("Insert label"); 
     buttonButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       JLabel label = new JLabel("label"); 
       label.setAlignmentY(0.85f); 
       pane.insertComponent(label); 
      } 
     }); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(buttonButton, BorderLayout.SOUTH); 
     panel.add(pane, BorderLayout.CENTER); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 200); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
}