通常,當您雙擊文本組件時,將選擇整個單詞。在JTextComponent中禁用雙擊選擇
我想禁用這個單詞的選擇,但仍然保持點擊和拖動來選擇它的能力。
例:「敏捷的棕色狐狸跳過懶狗」
當我點擊,並從「的」在2002年底的「狗」,選定文本的開始拖累。但是,當我雙擊「棕色」時,「棕色」未被選中並且可以執行不同的動作。
有誰知道我該如何做到這一點?
通常,當您雙擊文本組件時,將選擇整個單詞。在JTextComponent中禁用雙擊選擇
我想禁用這個單詞的選擇,但仍然保持點擊和拖動來選擇它的能力。
例:「敏捷的棕色狐狸跳過懶狗」
當我點擊,並從「的」在2002年底的「狗」,選定文本的開始拖累。但是,當我雙擊「棕色」時,「棕色」未被選中並且可以執行不同的動作。
有誰知道我該如何做到這一點?
凡編輯爲JTextComponent的實例
DefaultCaret c=new DefaultCaret() {
public void mouseClicked(MouseEvent e) {
int nclicks = SwingUtilities2.getAdjustedClickCount(getComponent(), e);
if (! e.isConsumed() &&
SwingUtilities.isLeftMouseButton(e) &&
nclicks == 2
&& SwingUtilities2.canEventAccessSystemClipboard(e)) {
return;
}
super.mouseClicked(e);
}
public void mousePressed(MouseEvent e) {
int nclicks = SwingUtilities2.getAdjustedClickCount(getComponent(), e);
if (! e.isConsumed() &&
SwingUtilities.isLeftMouseButton(e) &&
nclicks == 2
&& SwingUtilities2.canEventAccessSystemClipboard(e)) {
return;
}
super.mousePressed(e);
}
};
c.setBlinkRate(edit.getCaret().getBlinkRate());
edit.setCaret(c);
偉大的,卓越的知識,你是King_of_JTextComponents,只有+1 – mKorbel 2012-02-29 09:03:48
謝謝。在實現基於java/swing的MS Word之類的編輯器之後,大量類似的問題已經有了解決方案。 – StanislavL 2012-02-29 09:24:31
我試着實現這個代碼,但無法找到SwingUtilities2。我正在使用jre1.6.0_05。我在網上查找SwingUtilities2,大多數帖子都建議不要依賴它。有沒有其他解決方案或解決方法?謝謝。 – 2012-03-01 15:24:41
我想你可以註冊自己的MouseListener
或MouseAdapter
並檢查MouseEvent
的點擊數(即getClickCount()
)。如果它等於2
,吞下事件,否則委託事件處理給超類(例如super.mouseClicked(...)
)。
「燕子」是指event.consume()。 – 2012-02-28 17:44:22
你可以實現雙擊這樣的:
setCaretPosition(0);
Documentation:這點在自嘲方法select(int,int)
這是一個代表呼籲setCaretPosition
然後moveCaretPosition
另一種方法是替換selectWord動作通過一個動作是什麼也不做:
textComponent.getActionMap().put(DefaultEditorKit.selectWordAction,
new TextAction(DefaultEditorKit.selectWordAction) {
public void actionPerformed(ActionEvent e) {
// DO NOTHING
}
});
您也可以使用此TECHNIC改變selectWord操作的行爲,如果你的一個單詞的定義是不是默認的Swing不同。
@Loic您的回答爲我工作。 但是,如果滿足某些條件,我仍然希望啓用單詞選擇。這是我如何做的:
Action defaultSelectWordAction = textComponent.getActionMap().get(DefaultEditorKit.selectWordAction);
textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, new TextAction(DefaultEditorKit.selectWordAction) {
@Override
public void actionPerformed(ActionEvent e) {
if (conditionFulfilled()) {
defaultSelectWordAction.actionPerformed(e);
} else {
// DO NOTHING
}
}
});
有兩個正確的方式如何確定DOUBLE_CLICK,請編輯與[SSCCE(http://sscce.org/) – mKorbel 2012-02-28 17:23:01
@mKorbel感到很抱歉,我更新了你的問題我的帖子有一個例子。 – 2012-03-01 15:48:30