后台:我在我的(大量)自定义JTextPane子类中使用自定义AWT D& D.换句话说,我已经使用pane.setDragEnabled(false)
禁用了Swing的D& D,并使用了我自己的DragSource,DragGestureListener等。
问题:当Swing的D& D被禁用时,JTextPane中的默认选择行为如下:
所需:选择不会丢失。 实际:在按下鼠标时,选择会立即丢失,因此我没有机会开始拖动操作,因为现在没有任何东西可以拖动。
我已将其部分追溯到BasicTextUI $ DragListener,因为这是调用窗格的getDragEnabled()
方法的类,但BasicTestUI似乎对文本组件的选择没有太大作用。所以,我仍然不确定清除选择的位置,但我需要找到它,以便我可以消除这种行为。
我使用了一个涉及从克拉听众设置持久性高光的黑客,所以即使选择丢失,我的拖动也可以与之交互。我对此并不满意,并且还有其他副作用。
非常感谢任何指示。
答案 0 :(得分:1)
经过多个小时的JDK源检查后,我确定选择行为是由Caret控制的,而不是文本组件或UI层次结构中的任何内容。
温和定制的Caret似乎可以解决这个问题。请注意,如果不覆盖mouseDragged(),则自定义拖动仍然有效,但在拖动开始后,通常会在窗格中更改选择,使用户认为他们只是拖动他们选择的部分文本。 / p>
textPane.setCaret(new DefaultCaret() {
@Override
public void mousePressed(MouseEvent evt) {
int pos = textPane.viewToModel(evt.getPoint());
if (pos > textPane.getSelectionStart() && pos < textPane.getSelectionEnd()) {
return;
}
super.mousePressed(evt);
}
@Override
public void mouseDragged(MouseEvent e) {
if (dragItem != null) return;
super.mouseDragged(e);
}
});