2017-04-13 15 views
0

私は、JEditorPaneとJComboBoxの2つのコンポーネントを持つ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

JEditorPaneに異なるスタイルを適用する方法の[実際の基本例](http://stackoverflow.com/questions/18948148/jeditorpane-set-foreground-color-for-different-words/18948340#18948340) ' – MadProgrammer

+0

レスポンスありがとう、私は実際にスタイルを適用するといいです(どれもこの例を小さくするためにここに表示されていません)。問題は、エディタペインでテキストが選択されている間にコンボボックスの入力を取得することです。 – Amber

答えて

3

...ここ

はUIのコードですが、私はどこフォーカスを使って何をやって始めることが確認されませんでしたJEdi​​torPaneのフォーカス/選択を失うことなく

コンボボックスから項目を選択すると、エディタペインのテキストの選択が失われることはありません。選択は残っていますが、エディタペインがフォーカスを取り戻すまで描画されません。

これを行う最も簡単な方法は、JMenuItemを使用することです。これを行う例については、Text Component FeaturesのSwingチュートリアルのセクションを読んでください。

あなたはまだコンボボックスを使用したい場合、あなたは、コンボボックスに整数値を追加することができますように、その後、コンボボックスのためのあなたのActionListenerのコードはになります:StyledEditorKitアクションから延長

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    Integer value = (Integer)comboBox.getSelectedItem(); 
    Action action = new StyledEditorKit.FontSizeAction("Font size", value); 
    action.actionPerformed(null); 
} 

TextActionTextActionは、フォーカスを持っている最後のテキストコンポーネントを認識しているため、そのテキストコンポーネントにフォントの変更が適用されます。

あなたが本当にテキストフィールドがカスタムCaretを作成およびNOTデフォルトの動作である(setSelectionVisible(false)を呼び出すfocusLostメソッドをオーバーライドする必要があり、その後の選択を表示したい場合。もちろん

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

この例には編集可能なコンボボックスが含まれていればいいですか? – Amber

関連する問題