Я пытаюсь создать перезаписывающий Курсор. У меня есть это, только когда я нажимаю более раннюю строку, карет исчезает, а затем, когда я нажимаю «вводить» для новой строки, она появляется снова.Не удается увидеть перезапись курсора при создании новой строки
Что я должен изменить в своем Кодексе, чтобы решить эту проблему?
вот мой Caret Класс:
public class Mycaret extends DefaultCaret {
protected static final int MIN_WIDTH = 8;
protected DefaultCaret dc = null;
JTextComponent com = null;
public Mycaret(int rate, DefaultCaret dc) {
this.dc = dc;
super.setBlinkRate(rate);
}
protected synchronized void damage(Rectangle r) {
if (r != null) {
try {
JTextComponent comp = getComponent();
TextUI mapper = comp.getUI();
char dotChar = 0;
if(comp.getText().length()>0){
dotChar = comp.getText().charAt(comp.getText().length()-1);
}
this.com = comp;
Rectangle r2 = mapper.modelToView(comp, getDot() + 1);
int width = r2.x - r.x;
if (width == 0) {
width = MIN_WIDTH;
}
comp.repaint(r.x, r.y, width, r.height);
this.x = r.x;
this.y = r.y;
this.width = width;
this.height = r.height;
}
catch (BadLocationException e) {
}
}
}
public void paint(Graphics g) {
char dotChar;
if (isVisible()) {
try {
JTextComponent comp = getComponent();
TextUI mapper = comp.getUI();
Rectangle r1 = mapper.modelToView(comp, getDot());
Rectangle r2 = mapper.modelToView(comp, getDot() + 1);
g = g.create();
g.setColor(comp.getForeground());
g.setXORMode(comp.getBackground());
int width = r2.x - r1.x;
dotChar = comp.getText(getDot(), 1).charAt(0);
if (width == 0 ) {
width = MIN_WIDTH;
}
g.fillRect(r1.x, r1.y, width, r1.height);
g.dispose();
} catch (BadLocationException e) {
}
}
}
}
это образец:
public class MyFrameSample extends JFrame {
DefaultCaret caret=null;
public MyFrameSample() {
JTextArea text = new JTextArea(10,20);
caret = new DefaultCaret();
text.setCaret(new Mycaret(500, caret));
add(text);
pack();
setVisible(true);
}
public static void main(String[] args) {
new MyFrameSample();
}
}
Я отредактировал мой вопрос – user3232446
Да, это должен быть мой вопрос :) – user3232446
Я думаю, что у меня есть лидерство в этом. Я предполагаю, что это происходит из-за ловушки в 'modelToView (comp, getDot() + 1)'. Обратите внимание, что морковь останавливает рендеринг * только в конце непустых строк, которые не являются последней строкой *. Эти позиции находятся именно там, где '\ n' будет находиться в документе.Поскольку морковь берет ширину между 'getDot()' и 'getDot() + 1', а' \ n' невидима, вы получаете невидимую морковь. – user1803551