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