【问题标题】:How to add JLabel to JEditorPane?如何将 JLabel 添加到 JEditorPane?
【发布时间】:2013-03-01 02:21:00
【问题描述】:

我正在尝试在 Swing 中扩展 StyledEditorKit,以便能够在编辑器中包含 JLabel。我能够做到这一点,这就是我到目前为止所得到的。在下图中,突出显示的文本 button 是 JLabel 类型,而其余文本是普通文本。

如您所见,标签呈现在比正常文本略低的位置。如何将其顶部与剩余文本的顶部对齐?

以下是用于创建此标签元素的视图代码:

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

【问题讨论】:

    标签: java swing layout jlabel jeditorpane


    【解决方案1】:

    尝试按照ComponentView 中的建议调整控制组件相对于文本基线定位的Component.getAlignmentY

    您也可以尝试使用JTextPane,它为嵌入式组件提供了更轻松的支持。可以使用insertComponent() 方法添加组件。这是一个例子,它也演示了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();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多