2014-03-27 61 views
0

我正在嘗試做一個小應用程序,用於比較2 JTextarea中包含的兩個相似文本。我想知道是否可以從第一個JTextarea中選擇文本並自動選擇第二個JTeaxtarea上的文本(讓我們考慮它保證現在2 JTextarea將具有相同的文本)? 我應該分享事件還是聽衆? 謝謝同時在2個JTextarea中選擇文本

+0

'2 JTextarea'&'2 JTextarea中包含的類似文本將具有相同的文本文本可以「相似」和「山姆」 e「在同一時間? – camickr

+0

(讓我們考慮這是保證2 JTextarea現在會有相同的文本) – CMPS

回答

2

這將是如果JTextComponent支持的選擇模型,以便更容易...

基本上,你可以做的是附加ChangeListenerJTextAreaCaret和監測更改Caret,改變響應其他JTextArea的選擇...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
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.CaretEvent; 
import javax.swing.event.CaretListener; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultHighlighter; 

public class MirrorTextSelection { 

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

    public MirrorTextSelection() { 
     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 { 

     private JTextArea left; 
     private JTextArea right; 

     private DefaultHighlighter.DefaultHighlightPainter highlightPainter; 

     public TestPane() { 

      highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(UIManager.getColor("TextArea.selectionBackground")); 

      left = new JTextArea(20, 20); 
      left.setWrapStyleWord(true); 
      left.setLineWrap(true); 
      right = new JTextArea(20, 20); 
      right.setWrapStyleWord(true); 
      right.setLineWrap(true); 

      left.setText("I am trying to do a small app that compares two similar texts contained in 2 JTextarea. I am wondering if it's possible to select text from the first JTextarea and automatically select the text on the second JTeaxtarea (lets consider that it's guarantee that the 2 JTextarea will have the same text for now) ? Should I share events or listeners ? Thank you"); 
      right.setText("I am trying to do a small app that compares two similar texts contained in 2 JTextarea. I am wondering if it's possible to select text from the first JTextarea and automatically select the text on the second JTeaxtarea (lets consider that it's guarantee that the 2 JTextarea will have the same text for now) ? Should I share events or listeners ? Thank you"); 

      setLayout(new GridLayout(0, 2)); 

      add(new JScrollPane(left)); 
      add(new JScrollPane(right)); 

      left.getCaret().addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        int dot = left.getCaret().getDot(); 
        int mark = left.getCaret().getMark(); 

        right.setCaretPosition(mark); 
        right.moveCaretPosition(dot); 
       } 
      }); 
     } 
    } 
} 

現在,當你運行它,你會發現右側似乎並沒有得到強調......什麼?!

選擇正在改變,它只是不被渲染,因爲該組件沒有焦點...

相反,你可以使用一個Highlighter來突出顯示文本...

private DefaultHighlighter.DefaultHighlightPainter highlightPainter; 
//... 
highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(UIManager.getColor("TextArea.selectionBackground")); 

left.getCaret().addChangeListener(new ChangeListener() { 
    @Override 
    public void stateChanged(ChangeEvent e) { 
     int dot = left.getCaret().getDot(); 
     int mark = left.getCaret().getMark(); 

     right.getHighlighter().removeAllHighlights(); 
     try { 
      int start = Math.min(dot, mark); 
      int end = Math.max(dot, mark); 
      right.getHighlighter().addHighlight(start, end, highlightPainter); 
     } catch (BadLocationException ex) { 
      ex.printStackTrace(); 
     } 
    } 
}); 

好的,這是現在正在工作,你可以控制高光的背景顏色...

還有另一種選擇...我們可以用rightJTextAreaCaret替換爲一個不隱藏選擇丟失焦點時...

public class HighlightCaret extends DefaultCaret { 

    @Override 
    public void install(JTextComponent c) { 
     super.install(c); 
     setSelectionVisible(true); 
    } 

    @Override 
    public void focusGained(FocusEvent e) { 
     JTextComponent component = getComponent(); 
     if (component.isEnabled()) { 
      if (component.isEditable()) { 
       setVisible(true); 
      } 
      setSelectionVisible(true); 
     } 
    } 

    @Override 
    public void focusLost(FocusEvent e) { 
     setVisible(false); 
    } 
} 

然後我們設置Caretright ...

right.setCaret(nwe HighlightCaret()); 

這意味着我們不需要Highlighter代碼,我們可以堅持原創,不僅可以控制背景選擇顏色,還可以控制前景選擇顏色......

相關問題