一千萬個為什麽

搜索

JEdi​​torPane矩形(列)選擇模式


我想知道如何擴展JEditorPane(或任何其他swing文本編輯組件)來處理矩形(列)選擇模式。它是當前文本編輯器中眾所周知的功能,您可以從偏移(列)開始選擇多個行(行),以偏移(列)結束,看起來像選擇文本的矩形,然後您鍵入的內容將覆蓋同時選擇每一行(行)。

一個想法是通過跟蹤鼠標事件突出顯示矩形形式的每一行,並在鍵入時跟蹤這些信息以使用它,從而覆蓋選擇並創建假選擇。但是,我不確定如何覆蓋選擇並跟蹤鼠標,也不確定如何重定向鍵入以影響每一行。

任何形式的任何幫助將不勝感激。

最佳答案

找到這個小代碼片段,其中涉及自定義 Caret (至處理碎片選擇)和熒光筆(顯示片段):

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

無論如何,我從來沒有運行過該代碼(它是斯坦尼斯拉夫的)。

轉載註明原文: JEdi​​torPane矩形(列)選擇模式

猜你喜歡