2012-08-28 10 views
5

Sto cercando di estendere lo StyledEditorKit in Swing per poter includere una JLabel all'interno dell'editor. Sono stato in grado di farlo e questo è quello che ho ottenuto finora. Nell'immagine sottostante, il testo evidenziato pulsante è di tipo JLabel mentre il resto del testo è testo normale.Come aggiungere JLabel a JEditorPane?

enter image description here

Come si può vedere l'etichetta rende un po 'al di sotto rispetto al testo normale. Come allineare la sua parte superiore con la parte superiore del testo rimanente?

Ecco il codice per la vista che viene usato per creare questa elemento etichetta:

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; 
     } 
} 

risposta

5

provare a regolare Component.getAlignmentY che controlla il posizionamento relativo componente alla linea base del testo come suggerito in ComponentView.

Si potrebbe anche provare a utilizzare JTextPane che fornisce un supporto più semplice per i componenti incorporati. I componenti possono essere aggiunti utilizzando il metodo insertComponent(). Ecco un esempio, anche demo 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(); 
      } 
     }); 
    } 
}