我正在嘗試做一個小應用程序,用於比較2 JTextarea
中包含的兩個相似文本。我想知道是否可以從第一個JTextarea
中選擇文本並自動選擇第二個JTeaxtarea
上的文本(讓我們考慮它保證現在2 JTextarea
將具有相同的文本)? 我應該分享事件還是聽衆? 謝謝同時在2個JTextarea中選擇文本
0
A
回答
2
這將是如果JTextComponent
支持的選擇模型,以便更容易...
基本上,你可以做的是附加ChangeListener
到JTextArea
的Caret
和監測更改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();
}
}
});
好的,這是現在正在工作,你可以控制高光的背景顏色...
還有另一種選擇...我們可以用right
JTextArea
的Caret
替換爲一個不隱藏選擇丟失焦點時...
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);
}
}
然後我們設置Caret
到right
...
right.setCaret(nwe HighlightCaret());
這意味着我們不需要Highlighter
代碼,我們可以堅持原創,不僅可以控制背景選擇顏色,還可以控制前景選擇顏色......
相關問題
- 1. 在JTextArea中檢測文本選擇
- 2. 在JTextArea中選擇文本片段
- 3. 在JTextArea中選擇文本不顯示任何選擇顏色
- 4. 哪個事件在Java JTextArea中選擇了文本觸發器?
- 5. 無法在2個不同文本輸入中分配jQuery時間選擇器。
- 6. 以編程方式在文本區域中選擇文本並同時在textarea中選擇相同的文本
- 7. 同時在不同樹形視圖中選擇2個節點
- 8. 同時在2個文本框中突出顯示文本
- 9. php/mysql。在2個表中選擇2個共同字段
- 10. 如何在JTextArea Swing上禁用文本選擇
- 11. 在JTextArea中插入文本
- 12. 在jTextArea中處理文本
- 13. JTextArea中的不同文本顏色
- 14. 用崇高文本選擇文本2
- 15. 如何在Jtextarea中選擇一條線?
- 16. 從同一列中選擇2個值
- 17. 在崇高文本2中交換文本選擇
- 18. HTML:選擇 - 一個選項內的2個不同的文本顏色
- 19. 選擇2:標籤:選定標籤的不同文本
- 20. 在第三個DataGridView中選擇時,如何在2個DataGridView中選擇一行?
- 21. 文本去JTextArea
- 22. 從2個選擇選擇
- 23. 日期選擇器在三個不同的文本框中
- 24. 在同一個查詢中選擇屬性和文本()
- 25. 2個主題和2個JTextArea
- 26. 在運行時選擇框中的選項更改,同時在不同的選擇框中選擇選項
- 27. 崇高文本2代替多重選擇從多個選擇一個文件在另一個文件
- 28. 在JTextPane中選擇文本
- 29. 在WebView中選擇文本?
- 30. 在QTextBrowser中選擇文本
'2 JTextarea'&'2 JTextarea中包含的類似文本將具有相同的文本文本可以「相似」和「山姆」 e「在同一時間? – camickr
(讓我們考慮這是保證2 JTextarea現在會有相同的文本) – CMPS