我想知道如何扩展 JEditorPane(或任何其他摆动文本编辑组件)以处理矩形(列)选择模式。这是当前文本编辑器中众所周知的功能,您可以选择从偏移量(列)开始并以偏移量(列)结束的多行(行),看起来就像选择一个文本矩形,然后您输入的内容将覆盖同时在每一行(行)中进行选择。
一个想法是通过跟随鼠标事件以矩形形式突出显示每一行,并在键入时跟踪此类信息以使用它来覆盖选择并创建假选择。但是,我不确定如何覆盖选择并跟踪鼠标,也不确定如何重定向输入以影响每一行。
任何形式的帮助将不胜感激。
我想知道如何扩展 JEditorPane(或任何其他摆动文本编辑组件)以处理矩形(列)选择模式。这是当前文本编辑器中众所周知的功能,您可以选择从偏移量(列)开始并以偏移量(列)结束的多行(行),看起来就像选择一个文本矩形,然后您输入的内容将覆盖同时在每一行(行)中进行选择。
一个想法是通过跟随鼠标事件以矩形形式突出显示每一行,并在键入时跟踪此类信息以使用它来覆盖选择并创建假选择。但是,我不确定如何覆盖选择并跟踪鼠标,也不确定如何重定向输入以影响每一行。
任何形式的帮助将不胜感激。
找到这个小代码片段,其中涉及自定义Caret
(处理碎片选择)和Highlighter
(显示片段):
class MyCaret extends DefaultCaret {
Point lastPoint=new Point(0,0);
public void mouseMoved(MouseEvent e) {
super.mouseMoved(e);
lastPoint=new Point(e.getX(),e.getY());
}
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
getComponent().getHighlighter().removeAllHighlights();
}
protected void moveCaret(MouseEvent e) {
Point pt = new Point(e.getX(), e.getY());
Position.Bias[] biasRet = new Position.Bias[1];
int pos = getComponent().getUI().viewToModel(getComponent(), pt, biasRet);
if(biasRet[0] == null)
biasRet[0] = Position.Bias.Forward;
if (pos >= 0) {
setDot(pos);
Point start=new Point(Math.min(lastPoint.x,pt.x),Math.min(lastPoint.y,pt.y));
Point end=new Point(Math.max(lastPoint.x,pt.x),Math.max(lastPoint.y,pt.y));
customHighlight(start,end);
}
}
protected void customHighlight(Point start, Point end) {
getComponent().getHighlighter().removeAllHighlights();
int y=start.y;
int firstX=start.x;
int lastX=end.x;
int pos1 = getComponent().getUI().viewToModel(getComponent(), new Point(firstX,y));
int pos2 = getComponent().getUI().viewToModel(getComponent(), new Point(lastX,y));
try {
getComponent().getHighlighter().addHighlight(pos1,pos2,
((DefaultHighlighter)getComponent().getHighlighter()).DefaultPainter);
}
catch (Exception ex) {
ex.printStackTrace();
}
y++;
while (y<end.y) {
int pos1new = getComponent().getUI().viewToModel(getComponent(), new Point(firstX,y));
int pos2new = getComponent().getUI().viewToModel(getComponent(), new Point(lastX,y));
if (pos1!=pos1new) {
pos1=pos1new;
pos2=pos2new;
try {
getComponent().getHighlighter().addHighlight(pos1,pos2,
((DefaultHighlighter)getComponent().getHighlighter()).DefaultPainter);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
y++;
}
}
}
无论如何,我从未运行过该代码(它是斯坦尼斯拉夫的)。