2011-05-05 21 views
1

JTextField가있는 경우 JTextPane의 텍스트를 프로그래밍 방식으로 선택할 수없는 이유는 무엇입니까? 내가 생각하는 초점과 관련이있다. 고마워.JTextPane과 JTextField 사이의 텍스트 선택 충돌

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.beans.PropertyChangeListener; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JTextPane; 
import javax.swing.KeyStroke; 

public class align extends JFrame { 

    private align() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     addPane(this, "one"); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     align t = new align(); 
    } 

    private void addPane(JFrame frame, String name) { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     // if the next line is disabled, then the text is JTextPane is correctly highlighted.,, 
     panel.add(makeField("line1")); 

     JTextPane p = new JTextPane(); 
     p.setText("abcdef"); 
     p.setSelectionStart(2); 
     p.setSelectionEnd(4); 
     p.setFocusable(true); 
     p.requestFocus(); 
     p.requestDefaultFocus(); 
     panel.add(p); 

     frame.getContentPane().add(panel); 
    } 

    private JComponent makeField(String name) { 
     JTextField textArea = new JTextField(); 
     textArea.setText(name); 
     textArea.setEditable(false); 

     return textArea; 
    } 
} 

편집 :

는 프레임이 구축 된 후 키 이벤트를 발사하여 선택한 텍스트를 표시하는 알았어요. 더 나은 (더 긴) 솔루션은 클립 보드를 Ctrl-C에서 업데이트 된 상태로 유지하는 사용자 정의 형광펜 및 DocumentListener와 함께 읽기 전용 텍스트 패널을 갖는 것입니다.

Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(
      new KeyEvent(textPane, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_TAB)); 
+2

'JComponent.requestDefaultFocus()'와 같이 사용되지 않는 메소드를 사용하지 마십시오. –

+0

Java 명명 규칙을 배우고 사용하십시오. – kleopatra

답변

3

JTextPane의 텍스트가 선택이다. 문제는 구성 요소에 초점이 맞추어 져 있지 않으면 시각적 표시를 제공하지 않는다는 것입니다. GUI가 표시되면 구성 요소로 이동하십시오.


그래서, 나는이 유의 해제해야?

아니요, 텍스트 선택을 사용하여 손상된 GUI를 재 설계하여 관심있는 텍스트를 식별해야합니다. 텍스트 선택은 응용 프로그램이 아니라 최종 사용자가 수행하기에 더 적합합니다.

을 감안할 때 JTextPane

이 포맷을 지원하는 구성 요소입니다, 아마도 텍스트 예를 들어 굵은 또는 기울임을합니다. 강조 표시가 나타나도록

+0

그래서이 메모를 릴리스해야합니까 ?? "친애하는 사용자, 탭 키를 눌러 선택 사항을 볼 수 있습니까?" lol – Saideira

3

은 어쩌면 당신은 모든 텍스트 구성 요소에 형광펜을 사용한다 : 내가 사용해, DefaultCaret을 연장 Stanislav의 의견을 따라 :-)

Highlighter.HighlightPainter yellow = 
    new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 

try 
{ 
    textPane.getHighlighter().addHighlight(2, 4, yellow); 
} 
catch(BadLocationException ble) { System.out.println(ble); } 
+0

영리한 접근법. 색상을 싫어. ;) –

+0

화장품 용도로 강조 표시해야하는 경우 작동합니다. 클립 보드 기능에 대한 실제 선택이 필요합니다. – Saideira

+1

@Saideira 그런 다음 클립 보드에 대한 복사 기능이 포커스가있는 구성 요소에서만 작동하기 때문에 한 번에 하나의 선택 항목 만 표시하면됩니다. 그래서 이것은 문제가되지 않습니다. – camickr

3
p.getCaret().setSelectionVisible(true); 
+0

멋진 - 오늘 내 항목을 배우십시오 (지금까지 :-) – kleopatra

+0

, 어떻게 그 방식으로 유지할 수 있습니까? 창에 초점이 맞춰지면 /는 선택 표시가 다시 사라집니다. 흠 ... – kleopatra

+0

오른쪽. 포커스가 없어지면 선택 항목은 false로 설정되지만 자체 캐럿을 사용할 수도 있습니다. DefaultCaret을 확장하고 논리를 재정의하십시오. – StanislavL

3

그냥 재미를 위해 (결국은 금요일입니다 초점이 맞지 않은 textComponents에 대해 선택 영역을 계속 표시합니다.

기본 아이디어

  • 지원이 선택 장식 : 초점 선택, 초점이 맞지 선택
  • 는-사용하여 다시 귀결 가능한 LAF 기본, 근처로 선택 하이라이트의 모양을 유지 선택은 항상 볼 수 있다는 믿음으로 selectionPainter (만 액세스하여 ... 기침, 기침 .. 반사)
  • 바보 슈퍼

    public static class WrappingCaret extends DefaultCaret { 
    
        private DefaultCaret delegate; 
        private HighlightPainter focusedSelectionPainter; 
        private HighlightPainter unfocusedSelectionPainter; 
        private boolean focusedSelectionVisible; 
    
        public WrappingCaret(JTextComponent target) { 
         installDelegate((DefaultCaret) target.getCaret()); 
         target.setCaret(this); 
        } 
    
        private void installDelegate(DefaultCaret delegate) { 
         this.delegate = delegate; 
         setBlinkRate(delegate.getBlinkRate()); 
        } 
    
        private void installSelectionPainters() { 
         if (delegate instanceof BasicCaret) { 
          installDefaultPainters(); 
         } else { 
          try { 
           Method method = delegate.getClass().getDeclaredMethod(
             "getSelectionPainter"); 
           method.setAccessible(true); 
           focusedSelectionPainter = (HighlightPainter) method 
             .invoke(delegate); 
           Constructor<?>[] constructors = focusedSelectionPainter 
             .getClass().getDeclaredConstructors(); 
           constructors[0].setAccessible(true); 
           unfocusedSelectionPainter = (HighlightPainter) constructors[0] 
             .newInstance(getUnfocusedSelectionColor()); 
          } catch (Exception e) { 
           installDefaultPainters(); 
          } 
         } 
        } 
    
        private Color getUnfocusedSelectionColor() { 
         Color first = getComponent().getSelectionColor(); 
         // create a reasonable unfocusedSelectionColor 
         return PaintUtils.setAlpha(first, 125); 
        } 
    
        private void installDefaultPainters() { 
         focusedSelectionPainter = super.getSelectionPainter(); 
         unfocusedSelectionPainter = new DefaultHighlightPainter(
           getUnfocusedSelectionColor()); 
        } 
    
        /** 
        * @inherited <p> 
        */ 
        @Override 
        public void install(JTextComponent c) { 
         super.install(c); 
         installSelectionPainters(); 
         setSelectionVisible(isSelectionVisible()); 
        } 
    
        /** 
        * @inherited <p> 
        */ 
        @Override 
        public void setSelectionVisible(boolean vis) { 
         focusedSelectionVisible = vis; 
         super.setSelectionVisible(!isSelectionVisible()); 
         super.setSelectionVisible(true); 
        } 
    
        /** 
        * @inherited <p> 
        */ 
        @Override 
        protected HighlightPainter getSelectionPainter() { 
         return focusedSelectionVisible ? focusedSelectionPainter 
           : unfocusedSelectionPainter; 
        } 
    
    } 
    

즐기십시오!