Изменение предпочтения ParagraphView - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть JTextPane и над ним JSlider в моем приложении Swing. Когда я перетаскиваю ползунок, я хочу, чтобы абзац JTextPane, который в настоящее время имеет каретку, уменьшал / увеличивал свою ширину (и соответственно регулировал высоту). Я реализовал следующий код, но, похоже, ничего не работает. Я реализовал некоторые функции, похожие на это раньше, но я думаю, что я что-то упустил сейчас. Может ли кто-нибудь указать на ошибку.

public class ExtendedParagraphView extends ParagraphView {
    /** Maximum width of a single char (assuming monospaced font) {#{@value}}*/
    public  static  final   float   CHARACTER_WIDTH = (float) 8.0;
    /* DELTA is used to adjust the width of the paragraph view */
    private float   DELTA = (float) 0.0;
    public ExtendedParagraphView(Element arg0) {
        super(arg0);
    }

    /**
     * Shift the paragraph to the left/right by an amount given by the 
     * difference between the end and the start position
     * @param start
     * @param end
     */
    public void shiftParagraphView (int start, int end) {
        /* The difference in pixel position is always calculated in terms of the
         * difference between the end and start position */
        DELTA = (float)(end - start) * ExtendedParagraphView.CHARACTER_WIDTH;
    }

    @Override
    public float getPreferredSpan (int axis) {
        if (axis == View.Y_AXIS) {
            return  super.getPreferredSpan(axis);
        }
        return  super.getPreferredSpan(axis) - this.DELTA;
    }
}

Ниже приведен код, из которого вызывается метод shiftParagraphView внутри ExtendedParagraphView.

protected void shiftTextPaneElement (int start, int end) {
    if (start == end) {
        return;
    }

    int dot = this.textpane.getCaret().getDot();
    int mark = this.textpane.getCaret().getMark();
    int pos = mark <= dot ? mark : dot;

    View view = textpane.getUI().getRootView(textpane);
    int n = view.getViewCount();
    for (int i = 0; i < n; i++) {
        View v = view.getView(i);
        if (v instanceof BoxView) {
            int m = v.getViewCount();
            for (int k = 0; k < m; k++) {
                View vv = v.getView(k);
                if (vv instanceof ExtendedParagraphView) {
                    ((ExtendedParagraphView) vv).
                        shiftParagraphView(start, end);
                    return; //only a single paragraph is currently shifted
                }
            }
        }
    }
}

Примечание. После некоторых проб и ошибок, похоже, работает следующее:

public void shiftParagraphView (int start, int end) {
    DELTA = (float)(end - start) * ExtendedParagraphView.CHARACTER_WIDTH;
    this.setInsets(getTopInset(), (short) (getLeftInset() + DELTA), 
        getBottomInset(), getRightInset());
    this.getParent().preferenceChanged(this, true, false);
    this.getContainer().repaint();
}

1 Ответ

2 голосов
/ 11 ноября 2011

Используйте yourStyledDocument.setParagraphAttributes() вместо указания желаемого отступа слева и справа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...