2012-08-28 12 views
5

Ich versuche, das StyledEditorKit in Swing zu erweitern, um ein JLabel in den Editor einfügen zu können. Das konnte ich und das habe ich bis jetzt erreicht. In der Abbildung unten ist der markierte Text Schaltfläche vom Typ JLabel, während der Rest des Textes normaler Text ist.Wie man JLabel zu JEditorPane hinzufügt?

enter image description here

Wie Sie das Etikett sehen macht etwas unter als der normale Text. Wie richte ich das obere Ende mit dem oberen Teil des restlichen Textes aus? Hier

ist der Code für die Ansicht, die verwendet wird, um dieses Label-Element zu erzeugen:

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

Antwort

5

Versuchen Component.getAlignmentY Einstellung, die die Positionierung des Bauteils relativ zur Textgrundlinie steuert, wie in ComponentView vorgeschlagen.

Sie könnten auch versuchen, JTextPane zu verwenden, die einfachere Unterstützung für eingebettete Komponenten bietet. Komponenten können mit der Methode insertComponent() hinzugefügt werden. Hier ist ein Beispiel, es auch 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(); 
      } 
     }); 
    } 
}