如何在放置光标或在JTextPane中选择文本时更改JCombobox中的相应字体名称?

时间:2018-11-05 10:35:28

标签: java swing jcombobox

我正在用Java Swing创建一个文本编辑器应用程序。我正在使用JTextPane,并且添加了代码以在JComboBox中获取所有系统字体和某些字体大小。

我已经在jtextpane中输入了文本“ Hello World”,并将单词“ Hello”的字体更改为“ Arial”,字体大小更改为10,将“ World”更改为“ Calibri”,字体大小更改为12。 >

我的预期情况: 如果我选择单词“ Hello”或将光标置于单词“ Hello”,则字体JCombobox中的字体名称应自动更改为“ Arial”,字体大小Jcombobox应自动更改为10,与单词“世界”,则Jcombobox中的值应更改为“ Calibri”和“ 12”。我该如何实现? 预先感谢。

1 个答案:

答案 0 :(得分:1)

这基本上解决了如何选择与所选文本或文本中的光标位置相对应的组合框项目的问题。对于该示例,我仅选择了字体大小。同样的技术也可以应用于字体家族。

该示例是使用JTextPane的文本编辑器,其文档类型是DefaultStyledDocument。有JComboBox,其中列出了字体大小(16到50)。可以在编辑器中选择一段文本,然后从组合框中选择一种字体大小,以将文本设置为该字体大小。这可以通过将ItemListener添加到JComboBox来实现。侦听器具有用于将编辑器文档的属性设置为新选择的字体大小-所选文本的代码。

编辑器允许将多种字体大小应用于文本的不同部分,如下图所示。

enter image description here


要求是将插入标记(或光标)放置在文本或所选文本的一部分中时-需要在JComboBox中使用字体大小设置相应的字体大小。为此,将CaretListener添加到JTextPane

此侦听器的逻辑主要定位插入符号的位置,获取该位置处文档文本的属性,并提取字体大小属性。在字体大小组合框中设置此属性的字体大小。

示例代码:

public class Editor2 {

    private JTextPane editor;
    private DefaultStyledDocument doc;
    private JComboBox<String> fontSizeComboBox;
    private boolean caretControlFlag;
    private static final int DEFAULT_FONT_SIZE = 18;

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

    private void createAndShowGUI() {
        editor = new JTextPane();
        editor.setMargin(new Insets(5, 5, 5, 5));
        editor.addCaretListener(new MyCaretListener());     
        JScrollPane editorScrollPane = new JScrollPane(editor);
        doc = new DefaultStyledDocument();
        initDocAttrs();
        editor.setDocument(doc);

        final String [] fontSizes = {"Font Size", "16", "18", 
            "20", "24", "28", "30", "34", "40", "50"};
        fontSizeComboBox = new JComboBox<String>(fontSizes);
        fontSizeComboBox.setEditable(false);
        fontSizeComboBox.addItemListener(new FontSizeItemListener());
        JFrame frame = new JFrame("Text Editor");
        frame.add(fontSizeComboBox, BorderLayout.NORTH);
        frame.add(editorScrollPane, BorderLayout.CENTER);
        frame.add(editorScrollPane);
        frame.setSize(800, 400);
        frame.setLocation(300, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        editor.requestFocusInWindow();
    }

    private void initDocAttrs() {
        Style style = doc.addStyle("my_doc_style", null);
        StyleConstants.setFontSize(style, 18);
        StyleConstants.setFontFamily(style, "SansSerif");
        doc.setParagraphAttributes(0, doc.getLength(), style, true);
    }

    private class FontSizeItemListener implements ItemListener {
        @Override
        public void itemStateChanged(ItemEvent e) {
            if ((e.getStateChange() != ItemEvent.SELECTED) ||
                    (fontSizeComboBox.getSelectedIndex() == 0)) {
                return;
            }
            String fontSizeStr = (String) e.getItem();
            int newFontSize = 0;
            try {
                newFontSize = Integer.parseInt(fontSizeStr);
            }
            catch (NumberFormatException ex) {
                return;
            }
            if (caretControlFlag) {
                caretControlFlag = false;
                return;
            }
            setFontAttrs(newFontSize);
            editor.requestFocusInWindow();
        }

        private void setFontAttrs(int newFontSize) {
            SimpleAttributeSet attrs = new SimpleAttributeSet();
            Style docStyle = doc.getStyle("my_doc_style");  
            int size = StyleConstants.getFontSize(docStyle);
            StyleConstants.setFontSize(attrs, newFontSize);
            String attrName = "mysize" + Integer.toString(newFontSize);
            attrs.addAttribute(attrName, attrName);

            int startPos = editor.getSelectionStart();
            String selectedText = editor.getSelectedText();
            if (selectedText == null || selectedText.trim().isEmpty()) {
                return;
            }
            int length = selectedText.length(); 
            doc.setCharacterAttributes(startPos, length, attrs, false);     
            editor.setDocument(doc);
        }
    }


    private class MyCaretListener implements CaretListener {
        @Override
        public void caretUpdate(CaretEvent e) {
            caretControlFlag = true;
            int dot = e.getDot();
            Element ele = doc.getCharacterElement(dot);
            AttributeSet attrs = ele.getAttributes();
            String fontSizeStr = "18";
            for (Enumeration en = attrs.getAttributeNames(); en.hasMoreElements();) {
                String attrName = en.nextElement().toString();
                if (attrName.contains("mysize")) {
                    fontSizeStr = attrName.substring(6);
                }
            }
            fontSizeComboBox.setSelectedItem(fontSizeStr);
            caretControlFlag = false;
        }
    }
}