이 없을 것입니다. 이로 인해 캐럿 위치가 실시간으로 변경된시기를 알 수있었습니다. 난 단지 현재의 텍스트 영역이 실제로 그때 적용했다 (다음 업데이트,이 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-
)
당신이 텍스트를 선택한 것 이외의 초점을 텍스트 구성 요소 쇼를 만들기 위해 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;
}
}
}
}
}
}
확실하지 수에 변화 핸들러 내에 업데이트했지만, 왜 선택 관리자를 동기화하지 ? – MadProgrammer
나는 그것에 대해 공개적이지만, 나는 선택 관리자들에 익숙하지 않다. 몇 마디 말씀해 주시겠습니까? –
어떤 구성 요소를 사용하고 있습니까? 어떤 종류의 텍스트 구성 요소처럼 들립니다. – MadProgrammer