2017-04-13 9 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에 대한 코드입니다,하지만 난 어디에 초점을 아무것도 시작할 확실하지 않았다 JEditorPane의 포커스/선택을 잃지 않고

콤보 상자에서 항목을 선택할 때 편집기 창에서 텍스트 선택을 잃지 마십시오. 선택 영역은 그대로 유지되지만 편집기 창에 포커스가 다시 나타날 때까지 페인트되지 않습니다.

그래서 가장 쉬운 방법은 JMenuItem을 사용하는 것입니다. 이 작업을 수행하는 예제는 Text Component Features에있는 스윙 튜토리얼의 섹션을 읽으십시오.

당신은 여전히 ​​같은 것을 보일 것이다 다음 콤보 상자에 대한 귀하의 ActionListener에서 콤보 상자 다음 코드에 정수 값을 추가 할 수있는 콤보 상자를 사용하고자하는 경우 : StyledEditorKit 행동에서 연장

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

TextAction. TextAction은 포커스가있는 마지막 텍스트 구성 요소를 알고 있으므로 해당 텍스트 구성 요소에 글꼴 변경 내용이 적용됩니다.

당신이 정말로 텍스트 필드에 사용자 정의 Caret을 만들고 NOT 기본 동작 인 (setSelectionVisible(false)를 호출 focusLost 메소드를 오버라이드 (override) 할 필요가 다음 선택을 표시합니다. 물론

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

Caret 및 TextAction에 대한 매우 유용한 정보 예제에 편집 가능한 콤보 상자가 포함되어 있다면 좋았 겠지만 계속 진행해야하는 정보를 제공합니다! – Amber