2013-08-13 5 views
1

두 개의 JTextComponents (16 진수 및 ASCII)로 구성된 16 진 편집기와 비슷한보기를 작성하고 있습니다. 두 개의 뷰 사이에서 선택 사항을 동기화하고 싶습니다. 그래서 두 개의 컴포넌트에 대해 CaretListener를 구현했습니다. 이 기능은 사용자가 마우스를 길게 누른 상태에서 드래그하여 놓은 선택 이벤트에 응답하는 데 적합합니다. 사용자가 마우스를 놓을 때 구성 요소는 caretUpdate를 수신합니다.자바 스윙에서 실시간으로 캐럿 이벤트를받을 수 있습니까?

사용자가 마우스를 누르고 해제하지 않고 마우스를 드래그 할 때마다 구성 요소가 점증적인 caretUpdate 이벤트를 수신하는 방법은 무엇입니까? 이

+0

확실하지 수에 변화 핸들러 내에 업데이트했지만, 왜 선택 관리자를 동기화하지 ? – MadProgrammer

+0

나는 그것에 대해 공개적이지만, 나는 선택 관리자들에 익숙하지 않다. 몇 마디 말씀해 주시겠습니까? –

+0

어떤 구성 요소를 사용하고 있습니까? 어떤 종류의 텍스트 구성 요소처럼 들립니다. – MadProgrammer

답변

7

은, 불행하게도, JTextArea에 대한 선택 모델, 그렇지 않으면이 ... 정말 쉽게되는 대신, 각 텍스트 영역의 CaretChangeListener를 추가하도록 강요했다

이 없을 것입니다. 이로 인해 캐럿 위치가 실시간으로 변경된시기를 알 수있었습니다. 난 단지 현재의 텍스트 영역이 실제로 그때 적용했다 (다음 업데이트,이 NB 쉽게 수리 할 수 ​​확인)

을 선택 하이라이트의가 .... 그건 보여줄 것을 깨달았을 때

다음 문제가 발생했습니다 초점이 맞지 텍스트 영역에 형광펜 ...

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import java.io.File; 
import java.io.FileReader; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultHighlighter; 

public class CaretTest { 

    public static void main(String[] args) { 
     new CaretTest(); 
    } 

    public CaretTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridLayout(1, 2)); 

      JTextArea left = new JTextArea(10, 20); 
      JTextArea right = new JTextArea(10, 20); 

      left.setEditable(false); 
      right.setEditable(false); 

      left.getCaret().addChangeListener(new ChangeHandler(left, right)); 
      right.getCaret().addChangeListener(new ChangeHandler(right, left)); 

      left.addFocusListener(new FocusHandler(left, right)); 
      right.addFocusListener(new FocusHandler(right, left)); 

      JScrollPane leftSP = new JScrollPane(left); 
      JScrollPane rightSP = new JScrollPane(right); 

      leftSP.getHorizontalScrollBar().setModel(rightSP.getHorizontalScrollBar().getModel()); 
      leftSP.getVerticalScrollBar().setModel(rightSP.getVerticalScrollBar().getModel()); 

      add(leftSP); 
      add(rightSP); 

      FileReader reader = null; 
      try { 

       reader = new FileReader(new File("Ni.txt")); 
       left.read(reader, null); 
       reader.close(); 
       reader = new FileReader(new File("Ni.txt")); 
       right.read(reader, null); 

      } catch (Exception exp) { 
       exp.printStackTrace(); 
      } finally { 
       try { 
        reader.close(); 
       } catch (Exception e) { 
       } 
      } 
     } 

     protected void updateHighlighting(JTextArea source, JTextArea target) { 
      DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(target.getSelectionColor()); 
      int start = source.getSelectionStart(); 
      int end = source.getSelectionEnd(); 
      try { 
       target.getHighlighter().addHighlight(start, end, painter); 
      } catch (BadLocationException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     public class ChangeHandler implements ChangeListener { 

      private final JTextArea source; 
      private final JTextArea target; 

      public ChangeHandler(JTextArea source, JTextArea target) { 
       this.source = source; 
       this.target = target; 
      } 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       if (e.getSource() == source.getCaret()) { 
        target.getHighlighter().removeAllHighlights(); 
        updateHighlighting(source, target); 
       } 
      } 
     } 

     public class FocusHandler extends FocusAdapter { 

      private final JTextArea source; 
      private final JTextArea target; 

      public FocusHandler(JTextArea source, JTextArea target) { 
       this.source = source; 
       this.target = target; 
      } 

      @Override 
      public void focusGained(FocusEvent e) { 
       source.getHighlighter().removeAllHighlights(); 
       target.getHighlighter().removeAllHighlights(); 
       updateHighlighting(source, target); 
      } 

     } 
    } 

} 

당신은 당신의 자신의 텍스트를 제공해야합니다 PS-

enter image description here)

당신이 텍스트를 선택한 것 이외의 초점을 텍스트 구성 요소 쇼를 만들기 위해 JTextComponent#getCaret()#setSelectionVisible(true)을 사용할 수 있다는 지적 StanislavL에 "비 형광펜"예와

업데이트

감사합니다.

나는 다시 false 만든 그 초점의 변화를 발견했다, 그래서 나는 가능하면 것인지 항상 true

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import java.io.File; 
import java.io.FileReader; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultHighlighter; 

public class CaretTest { 

    public static void main(String[] args) { 
     new CaretTest(); 
    } 

    public CaretTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridLayout(1, 2)); 

      JTextArea left = new JTextArea(10, 20); 
      JTextArea right = new JTextArea(10, 20); 

      left.setEditable(false); 
      right.setEditable(false); 

      left.getCaret().setSelectionVisible(true); 
      right.getCaret().setSelectionVisible(true); 

      left.getCaret().addChangeListener(new ChangeHandler(left, right)); 
      right.getCaret().addChangeListener(new ChangeHandler(right, left)); 

      JScrollPane leftSP = new JScrollPane(left); 
      JScrollPane rightSP = new JScrollPane(right); 

      leftSP.getHorizontalScrollBar().setModel(rightSP.getHorizontalScrollBar().getModel()); 
      leftSP.getVerticalScrollBar().setModel(rightSP.getVerticalScrollBar().getModel()); 

      add(leftSP); 
      add(rightSP); 

      FileReader reader = null; 
      try { 

       reader = new FileReader(new File("Ni.txt")); 
       left.read(reader, null); 
       reader.close(); 
       reader = new FileReader(new File("Ni.txt")); 
       right.read(reader, null); 

      } catch (Exception exp) { 
       exp.printStackTrace(); 
      } finally { 
       try { 
        reader.close(); 
       } catch (Exception e) { 
       } 
      } 
     } 
    } 

    public static class ChangeHandler implements ChangeListener { 

     private static boolean ignoreUpdates = false; 

     private final JTextArea source; 
     private final JTextArea target; 

     public ChangeHandler(JTextArea source, JTextArea target) { 
      this.source = source; 
      this.target = target; 
     } 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      if (e.getSource() == source.getCaret()) { 
       if (!ignoreUpdates) { 
        ignoreUpdates = true; 
        try { 
         target.getCaret().setSelectionVisible(true); 
         source.getCaret().setSelectionVisible(true); 
         target.setSelectionStart(source.getSelectionStart()); 
         target.setSelectionEnd(source.getSelectionEnd()); 
        } finally { 
         ignoreUpdates = false; 
        } 
       } 
      } 
     } 
    } 

} 
+1

> 현재 텍스트 영역이 실제로 선택 강조 표시 ... 실제로 사실이 아닙니다. 당신은 notFocusedTextArea.getCaret()을 사용할 수 있습니다. setSelectionVisible (true) (예를 들어 어쨌든 +1) – StanislavL

+0

@StanislavL 아, 정보를 주셔서 감사 드리며, 몇 가지 사항을 수정하고 내가 무엇을 생각해 낼지 지켜 볼 것입니다! – MadProgrammer

+0

@MadProgrammer는 전체 예제에 대한 자세한 답변을 주셔서 감사합니다. 정말 감사! –