跟踪文档位置更改

时间:2014-07-01 09:15:06

标签: java swing position document jtextcomponent

我使用Document方法createPositionPositions添加到数组中。这些Positions会根据用户插入/删除行而发生变化。

如何挂钩数组中的更改?我需要知道新值和它已经改变的值。

1 个答案:

答案 0 :(得分:1)

接口位置没有添加监听器来监视位置变化的方法。因此,您需要使用Position对象的包装器手动执行此操作。

public class PositionHolder {
  private int oldPosition;
  private Position position;
  private PropertyChangeSupport propertySupport = new PropertyChangeSupport(this);
  public PositionHolder(Position aPos) {
    position = aPos;
    oldPosition = aPos.getOffset();
  }
  public void addPropertyChangeListener(PropertyChangeListener aListener) {
    propertySupport.addPropertyChangeListener(aListener);
  }
  // same for remove listener
  public void verifyPosition() {
    // no custom if statement required - event is fiered only when old != new
    propertySupport.firePropertyChangeEvent("position", oldPosition, position.getOffset());
    oldPosition = position.getOffset();
  }
  public Position getPosition() {
    return position;
  }
}

public class PositionUpdater implements DocumentListener {
  private List<PositionHolder> holders;
  public PositionUpdater(List<PositionHolder> someHolders) {
    holders = someHolders;
  }

  public void insertUpdate(DocumentEvent e) {
    for (PositionHolder h : holders) {
      h.verifyPosition();
    }
  }
  public void removeUpdate(DocumentEvent e) {
    insertUpdate(e);
  }
  public void changeUpdate(DocumentEvent e) {
    insertUpdate(e);
  }
}

JTextComponent textComp = // your text component
List<PositionHolder> holderList = new ArrayList<>(); // your list of positions
textComp.getDocument().addDocumentListener(new PositionUpdater(holderList));

现在,当位置发生变化时,您会收到通知。您只需要为您的职位填充holderList包装器,并在这些包装器上注册您的事件监听器。