如何使用在 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
操作扩展自 TextAction
。 TextAction
知道最后一个具有焦点的文本组件,因此字体更改应用于该文本组件。
如果您确实希望文本字段显示 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 设计总是允许用户使用键盘或鼠标来执行操作。
我有一个包含两个组件的 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
操作扩展自 TextAction
。 TextAction
知道最后一个具有焦点的文本组件,因此字体更改应用于该文本组件。
如果您确实希望文本字段显示 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 设计总是允许用户使用键盘或鼠标来执行操作。