我有一个包含两个组件的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);
}
答案 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设计始终允许用户使用键盘或鼠标来执行操作。