У меня есть 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();
}