【问题标题】:How to edit a JComboBox with text selected in JEditorPane如何使用在 JEditorPane 中选择的文本编辑 JComboBox
【发布时间】:2017-04-13 22:42:50
【问题描述】:

我的 UI 包含两个组件 - JEditorPane 和 JComboBox。我的目标是能够在 JEditorPane 中输入内容,选择文本的一部分,并在仍处于选中状态时输入和/或在可编辑的 JComboBox 中选择一个值。

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

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

【问题讨论】:

  • As really basic example 如何将不同的样式应用到JEditorPane
  • 感谢您的回复,我很擅长实际应用样式(此处没有显示以保持示例小)。问题是在编辑器窗格中选择文本时获取组合框输入。

标签: java swing focus jcombobox jeditorpane


【解决方案1】:

我在问如何在组合框中选择一个值而不丢失 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 方法以调用 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 设计始终允许用户使用键盘或鼠标来执行操作。

【讨论】:

  • “StyledEditorKit 动作从 TextAction 扩展而来。TextAction 知道最后一个具有焦点的文本组件,因此字体更改将应用​​于该文本组件。” +1 仅用于那,学到了一些新东西:)
  • 有关 Caret 和 TextAction 的非常有用的信息。如果该示例包含一个可编辑的组合框,那就太好了 - 但这为我提供了继续操作所需的信息!
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 2012-04-14
相关资源
最近更新 更多