当Swing D& D被禁用时,如何覆盖JTextPane的选择行为?

时间:2013-12-06 15:39:31

标签: java swing drag-and-drop jtextpane jtextcomponent

后台:我在我的(大量)自定义JTextPane子类中使用自定义AWT D& D.换句话说,我已经使用pane.setDragEnabled(false)禁用了Swing的D& D,并使用了我自己的DragSource,DragGestureListener等。

问题:当Swing的D& D被禁用时,JTextPane中的默认选择行为如下:

  1. 使用鼠标选择一些文字
  2. 鼠标按下选择内部,意图开始拖动
  3. 所需:选择不会丢失。 实际:在按下鼠标时,选择会立即丢失,因此我没有机会开始拖动操作,因为现在没有任何东西可以拖动。

    我已将其部分追溯到BasicTextUI $ DragListener,因为这是调用窗格的getDragEnabled()方法的类,但BasicTestUI似乎对文本组件的选择没有太大作用。所以,我仍然不确定清除选择的位置,但我需要找到它,以便我可以消除这种行为。

    我使用了一个涉及从克拉听众设置持久性高光的黑客,所以即使选择丢失,我的拖动也可以与之交互。我对此并不满意,并且还有其他副作用。

    非常感谢任何指示。

1 个答案:

答案 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);
                }
            });