如何使用在 JEditorPane 中选择的文本编辑 JComboBox

How to edit a JComboBox with text selected in JEditorPane

我有一个包含两个组件的 UI - JEditorPane 和 JComboBox。我的目可编辑的 JComboBox.

这是针对文本编辑器类型的程序,我想在编辑器窗格中仅更改 selected 文本的字体大小。字体大小来自可编辑组合框的位置。澄清一下,我不是在问如何将样式应用于文本,我是在问如何 select 组合框中的值而不丢失 JEditorPane 中的 focus/selection。

这是 UI 的代码,但我不确定从哪里开始使用焦点...

public static void main(String [] args)
{
    JFrame frame = new JFrame();
    JPanel contentPane = new JPanel();

    JComboBox<String> combo = new JComboBox(new String [] {"Hello", "World"});
    contentPane.add(combo);

    JEditorPane editor = new JEditorPane();
    contentPane.add(editor);

    frame.setContentPane(contentPane);
    frame.pack();
    frame.setVisible(true);
}

I'm asking how to select a value in the combo box without losing the focus/selection in the JEditorPane.

当您从组合框中 select 一个项目时,您不会丢失 select 编辑器窗格中的文本。 selection 仍然存在,但在编辑器窗格重新获得焦点之前不会绘制它。

所以最简单的方法是使用 JMenuItem。阅读 Swing 教程中有关 Text Component Features 的部分,以获取执行此操作的示例。

如果您仍想使用组合框,则可以将整数值添加到组合框,然后 ActionListener 中用于组合框的代码如下所示:

@Override
public void actionPerformed(ActionEvent e)
{
    Integer value = (Integer)comboBox.getSelectedItem();
    Action action = new StyledEditorKit.FontSizeAction("Font size", value);
    action.actionPerformed(null);
}

StyledEditorKit 操作扩展自 TextActionTextAction 知道最后一个具有焦点的文本组件,因此字体更改应用于该文本组件。

如果您确实希望文本字段显示 selection,那么您需要创建自定义 Caret 并将 focusLost 方法覆盖为 NOT 调用 setSelectionVisible(false) (这是默认行为。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class DefaultCaretTest extends JFrame
{
    public DefaultCaretTest()
    {
        JTextField textField1 = new JTextField("Text Field1   ");
        JTextField textField2 = new JTextField("Text Field2   ");

        textField1.setCaret(new SelectionCaret());
        textField2.setCaret(new SelectionCaret());

        textField1.select(5, 11);
        textField2.select(5, 11);
        ((DefaultCaret)textField2.getCaret()).setSelectionVisible(true);

        add(textField1, BorderLayout.WEST);
        add(textField2, BorderLayout.EAST);
    }

    static class SelectionCaret extends DefaultCaret
    {
        public SelectionCaret()
        {
            setBlinkRate( UIManager.getInt("TextField.caretBlinkRate") );
        }

        public void focusGained(FocusEvent e)
        {
            setVisible(true);
            setSelectionVisible(true);
        }

        public void focusLost(FocusEvent e)
        {
            setVisible(false);
        }
    }

    public static void main(String[] args)
    {
        DefaultCaretTest frame = new DefaultCaretTest();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

当然,当焦点在任何其他组件上时,selection 将保留,而不仅仅是组合框。

您还可以使用:

comboBox.setFocusable(false);

由于组合框无法获得焦点,焦点将保留在文本组件上,但问题是用户将无法使用键盘来 select 字体大小从组合框。适当的 GUI 设计总是允许用户使用键盘或鼠标来执行操作。