【问题标题】:How do I override JTextPane's selection behavior when Swing D&D is disabled?当 Swing D&D 被禁用时,如何覆盖 JTextPane 的选择行为?
【发布时间】:2013-12-06 15:39:31
【问题描述】:

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

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

  1. 使用鼠标选择一些文本
  2. 鼠标在选定区域内按下以开始拖动

期望:选择不会丢失。 实际:鼠标按下时,选择立即丢失,我没有机会开始拖动操作,因为现在没有任何东西可以拖动。

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

我采用了一种技巧,其中涉及从克拉监听器设置持久高光,因此即使选择丢失,高光仍将保留,我的拖动可以与之交互。我对此不满意,它还有其他副作用。

非常感谢您的任何指点。

【问题讨论】:

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


    【解决方案1】:

    在审查 JDK 源代码后,我确定选择行为由插入符号控制,而不是文本组件或 UI 层次结构中的任何内容。

    一个适度定制的插入符号似乎可以解决问题。请注意,如果您不覆盖 mouseDragged(),自定义拖动仍然有效,但选择通常会在拖动开始后在窗格中更改,使用户认为他们只是拖动他们选择的文本的一部分。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多