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

时间:2017-04-13 22:42:50

标签: java swing focus jcombobox jeditorpane

我有一个包含两个组件的UI - 一个JEditorPane和一个JComboBox。我的目标是能够在JEditorPane中键入内容,选择文本的一部分,并且仍然选择类型和/或在可编辑的JComboBox中选择一个值。

这适用于文本编辑器类型的程序,我想在编辑器窗格中更改所选文本的字体大小。字体大小来自可编辑的组合框。为了澄清,我不是问如何在文本中应用样式,我问如何在组合框中选择一个值而不会丢失JEditorPane中的焦点/选择。

以下是用户界面的代码,但我不知道从哪里开始做任何重点......

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

1 个答案:

答案 0 :(得分:3)

  

我想知道如何在组合框中选择一个值,而不会丢失JEditorPane中的焦点/选择。

从组合框中选择项目时,您不会在编辑器窗格中丢失文本选择。选择仍然存在,但只有在编辑器窗格重新获得焦点之后才会被绘制。

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

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

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

StyledEditorKit行动从TextAction延伸。 TextAction知道最后一个具有焦点的文本组件,因此字体更改将应用​​于该文本组件。

如果您确实希望文本字段显示所选内容,则需要创建自定义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);
    }
}

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

您也可以使用:

comboBox.setFocusable(false);

由于组合框无法获得焦点,因此焦点将保留在文本组件上,但问题是用户无法使用键盘从中选择字体大小。组合框。正确的GUI设计始终允许用户使用键盘或鼠标来执行操作。