为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2021-12-30 17:34:30
我正在用 Java Swing 创建一个文本编辑器应用程序。我正在使用 JTextPane 并添加了代码来获取 JComboBox 中的所有系统字体和一些字体大小。我在 jtextpane 中输入了文本 - “Hello World”,并将“Hello”一词的字体更改为“Arial”,字体大小更改为 10,将“World”更改为“Calibri”,字体大小更改为 12。我的预期场景:如果我选择单词“Hello”或将光标放在单词“Hello”上,字体 JCombobox 中的字体名称应自动更改为“Arial”,字体大小 Jcombobox 应自动更改为 10,如与“World”一词相同,Jcombobox 中的值应更改为“Calibri”和“12”。我怎样才能做到这一点?提前致谢。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

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

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

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

//img1.sycdn.imooc.com//61cd7d440001be4807930298.jpg

要求是当插入符号(或光标)放置在文本或选定文本的一部分时 - 需要在字体大小中设置相应JComboBox的字体大小。为此,将 aCaretListener添加到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;

        }

    }

}



查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 246 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信