2017-04-13 42 views
0

我有一个包含两个组件的UI - 一个JEditorPane和一个JComboBox。我的目标是能够在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

[As really basic example](http://stackoverflow.com/questions/18948148/jeditorpane-set-foreground-color-for-different-words/18948340#18948340)如何将不同的样式应用到JEditorPane ' – MadProgrammer

+0

感谢您的回应,我很喜欢实际应用样式(这里没有显示这些样例以保持较小的样式)。问题是在编辑器窗格中选择文本时获取组合框输入。 – Amber

回答

3

我问如何选择在组合框中的值而不会失去JEditorPane的重点/选择。

当您从组合框中选择一个项目时,不会丢失在编辑器窗格中选择的文本。选择依然存在,但只有在编辑器窗格重新获得焦点后才能进行绘制。

所以最简单的方法是使用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行动从延长TextActionTextAction知道有焦点的最后一个文本组件,因此字体更改应用于该文本组件。

如果你真的想要的文本字段显示选择,那么你需要创建一个自定义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设计总是允许用户使用键盘或鼠标来执行操作。

+0

*“StyledEditorKit操作从TextAction扩展而来,TextAction知道最后一个具有焦点的文本组件,因此字体更改将应用​​于该文本组件。“* +1仅仅是为了这个,一些新的东西已经学会了:) – MadProgrammer

+0

有关插入符号和TextAction的非常有用的信息。如果示例包含一个可编辑的组合框 - 但是这给了我需要继续的信息! – Amber

相关问题