Режим выбора прямоугольника (столбца) JEditorPane

Я хотел бы знать, как я могу расширить JEditorPane (или любой другой компонент редактирования текста Swing) для обработки режима выбора прямоугольника (столбца). Это хорошо известная функция в современных текстовых редакторах, где вы можете выбрать несколько строк (строк), начиная со смещения (столбец) и заканчивая смещением (столбец), которые выглядят как выделение прямоугольника текста, а затем то, что вы вводите, будет перезаписано. выделение в каждой строке (строке) одновременно.

Одна из идей заключалась в том, чтобы переопределить выделение и создать фальшивое выделение, выделяя каждую строку в форме прямоугольника, следуя за событиями мыши и отслеживая такую ​​информацию, чтобы использовать ее при наборе текста. Однако я не совсем уверен, как отменить выбор и отслеживать мышь или как перенаправить ввод, чтобы повлиять на каждую строку.

Любая помощь в любой форме будет оценена по достоинству.


person 4xa    schedule 10.04.2011    source источник
comment
Я не знаю, как это сделать (извините), но я слышал, что это не так просто сделать.   -  person Hovercraft Full Of Eels    schedule 11.04.2011


Ответы (1)


Обнаружил этот небольшой фрагмент кода, в котором используются Custom 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++;
    }
}
}

Во всяком случае, я никогда не запускал этот код (это Станислав).

person Asaf    schedule 11.04.2011
comment
ну, вы должны были запустить его, хотя он и принадлежит Стэну ;-) Это, конечно, хороший трюк, но он ломается (неудивительно) при выборе клавиатуры. Чтобы действительно решить, нам нужна более богатая модель выбора, которая поддерживает вертикальный/фрагментированный выбор. Это, наверное, не так просто.. (хотя никогда не пробовал) - person kleopatra; 11.04.2011
comment
Кроме того, было бы сложно обрабатывать ввод во всех выбранных строках одновременно (используя replaceSelection с некоторыми хаками), не нарушая поведение по умолчанию и заканчивая странным/непригодным для использования редактором (пробовали весь прошлый день). Несмотря на то, что ваше отличное направление не удовлетворило то, что я искал, я отмечу его как правильный ответ (частично правильный) в качестве благодарности. - person 4xa; 12.04.2011
comment
10x. покажи код, а? Кроме того, есть ли какие-либо редакторы на основе Java, которые делают это? - person Asaf; 13.04.2011