Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
55e34dc4
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
55e34dc4
编写于
11月 19, 2013
作者:
S
serb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8027913: drop target notifications are sent out of order during DnD
Reviewed-by: anthony, art
上级
363da5d8
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
274 addition
and
38 deletion
+274
-38
src/share/classes/java/awt/Container.java
src/share/classes/java/awt/Container.java
+72
-38
test/java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java
...nd/MissingDragExitEventTest/MissingDragExitEventTest.java
+202
-0
未找到文件。
src/share/classes/java/awt/Container.java
浏览文件 @
55e34dc4
...
@@ -43,7 +43,6 @@ import java.io.PrintWriter;
...
@@ -43,7 +43,6 @@ import java.io.PrintWriter;
import
java.security.AccessController
;
import
java.security.AccessController
;
import
java.util.Arrays
;
import
java.util.EventListener
;
import
java.util.EventListener
;
import
java.util.HashSet
;
import
java.util.HashSet
;
import
java.util.Set
;
import
java.util.Set
;
...
@@ -4427,6 +4426,7 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
...
@@ -4427,6 +4426,7 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
stopListeningForOtherDrags
();
stopListeningForOtherDrags
();
mouseEventTarget
=
null
;
mouseEventTarget
=
null
;
targetLastEntered
=
null
;
targetLastEntered
=
null
;
targetLastEnteredDT
=
null
;
}
}
/**
/**
...
@@ -4617,44 +4617,65 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
...
@@ -4617,44 +4617,65 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
}
}
/*
/*
* Generates enter/exit events as mouse moves over lw components
* Generates
dnd
enter/exit events as mouse moves over lw components
* @param targetOver Target mouse is over (including native container)
* @param targetOver Target mouse is over (including native container)
* @param e
M
ouse event in native container
* @param e
SunDropTarget m
ouse event in native container
*/
*/
private
void
trackMouseEnterExit
(
Component
targetOver
,
MouseEvent
e
)
{
private
void
trackDropTargetEnterExit
(
Component
targetOver
,
MouseEvent
e
)
{
Component
targetEnter
=
null
;
int
id
=
e
.
getID
();
int
id
=
e
.
getID
();
if
(
id
==
MouseEvent
.
MOUSE_ENTERED
&&
isMouseDTInNativeContainer
)
{
if
(
e
instanceof
SunDropTargetEvent
&&
id
==
MouseEvent
.
MOUSE_ENTERED
&&
isMouseInNativeContainer
==
true
)
{
// This can happen if a lightweight component which initiated the
// This can happen if a lightweight component which initiated the
// drag has an associated drop target. MOUSE_ENTERED comes when the
// drag has an associated drop target. MOUSE_ENTERED comes when the
// mouse is in the native container already. To propagate this event
// mouse is in the native container already. To propagate this event
// properly we should null out targetLastEntered.
// properly we should null out targetLastEntered.
targetLastEntered
=
null
;
targetLastEnteredDT
=
null
;
}
else
if
(
id
!=
MouseEvent
.
MOUSE_EXITED
&&
}
else
if
(
id
==
MouseEvent
.
MOUSE_ENTERED
)
{
isMouseDTInNativeContainer
=
true
;
}
else
if
(
id
==
MouseEvent
.
MOUSE_EXITED
)
{
isMouseDTInNativeContainer
=
false
;
}
targetLastEnteredDT
=
retargetMouseEnterExit
(
targetOver
,
e
,
targetLastEnteredDT
,
isMouseDTInNativeContainer
);
}
/*
* Generates enter/exit events as mouse moves over lw components
* @param targetOver Target mouse is over (including native container)
* @param e Mouse event in native container
*/
private
void
trackMouseEnterExit
(
Component
targetOver
,
MouseEvent
e
)
{
if
(
e
instanceof
SunDropTargetEvent
)
{
trackDropTargetEnterExit
(
targetOver
,
e
);
return
;
}
int
id
=
e
.
getID
();
if
(
id
!=
MouseEvent
.
MOUSE_EXITED
&&
id
!=
MouseEvent
.
MOUSE_DRAGGED
&&
id
!=
MouseEvent
.
MOUSE_DRAGGED
&&
id
!=
LWD_MOUSE_DRAGGED_OVER
&&
id
!=
LWD_MOUSE_DRAGGED_OVER
&&
isMouseInNativeContainer
==
false
)
{
!
isMouseInNativeContainer
)
{
// any event but an exit or drag means we're in the native container
// any event but an exit or drag means we're in the native container
isMouseInNativeContainer
=
true
;
isMouseInNativeContainer
=
true
;
startListeningForOtherDrags
();
startListeningForOtherDrags
();
}
else
if
(
id
==
MouseEvent
.
MOUSE_EXITED
)
{
}
else
if
(
id
==
MouseEvent
.
MOUSE_EXITED
)
{
isMouseInNativeContainer
=
false
;
isMouseInNativeContainer
=
false
;
stopListeningForOtherDrags
();
stopListeningForOtherDrags
();
}
}
targetLastEntered
=
retargetMouseEnterExit
(
targetOver
,
e
,
if
(
isMouseInNativeContainer
)
{
targetLastEntered
,
targetEnter
=
targetOver
;
isMouseInNativeContainer
)
;
}
}
if
(
targetLastEntered
==
targetEnter
)
{
private
Component
retargetMouseEnterExit
(
Component
targetOver
,
MouseEvent
e
,
return
;
Component
lastEntered
,
}
boolean
inNativeContainer
)
{
int
id
=
e
.
getID
();
Component
targetEnter
=
inNativeContainer
?
targetOver
:
null
;
if
(
targetLastEntered
!=
null
)
{
if
(
lastEntered
!=
targetEnter
)
{
retargetMouseEvent
(
targetLastEntered
,
MouseEvent
.
MOUSE_EXITED
,
e
);
if
(
lastEntered
!=
null
)
{
retargetMouseEvent
(
lastEntered
,
MouseEvent
.
MOUSE_EXITED
,
e
);
}
}
if
(
id
==
MouseEvent
.
MOUSE_EXITED
)
{
if
(
id
==
MouseEvent
.
MOUSE_EXITED
)
{
// consume native exit event if we generate one
// consume native exit event if we generate one
...
@@ -4668,8 +4689,8 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
...
@@ -4668,8 +4689,8 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
// consume native enter event if we generate one
// consume native enter event if we generate one
e
.
consume
();
e
.
consume
();
}
}
}
targetLastEntered
=
targetEnter
;
return
targetEnter
;
}
}
/*
/*
...
@@ -4908,20 +4929,30 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
...
@@ -4908,20 +4929,30 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
private
transient
Component
mouseEventTarget
;
private
transient
Component
mouseEventTarget
;
/**
/**
* The last component entered
* The last component entered
by the {@code MouseEvent}.
*/
*/
private
transient
Component
targetLastEntered
;
private
transient
Component
targetLastEntered
;
/**
* The last component entered by the {@code SunDropTargetEvent}.
*/
private
transient
Component
targetLastEnteredDT
;
/**
/**
* Indicates whether {@code mouseEventTarget} was removed and nulled
* Indicates whether {@code mouseEventTarget} was removed and nulled
*/
*/
private
transient
boolean
isCleaned
;
private
transient
boolean
isCleaned
;
/**
/**
* Is the mouse over the native container
* Is the mouse over the native container
.
*/
*/
private
transient
boolean
isMouseInNativeContainer
=
false
;
private
transient
boolean
isMouseInNativeContainer
=
false
;
/**
* Is DnD over the native container.
*/
private
transient
boolean
isMouseDTInNativeContainer
=
false
;
/**
/**
* This variable is not used, but kept for serialization compatibility
* This variable is not used, but kept for serialization compatibility
*/
*/
...
@@ -4960,5 +4991,8 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
...
@@ -4960,5 +4991,8 @@ class LightweightDispatcher implements java.io.Serializable, AWTEventListener {
if
(
targetLastEntered
==
removedComponent
)
{
if
(
targetLastEntered
==
removedComponent
)
{
targetLastEntered
=
null
;
targetLastEntered
=
null
;
}
}
if
(
targetLastEnteredDT
==
removedComponent
)
{
targetLastEnteredDT
=
null
;
}
}
}
}
}
test/java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java
0 → 100644
浏览文件 @
55e34dc4
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8027913
* @library ../../regtesthelpers
* @build Util
* @compile MissingDragExitEventTest.java
* @run main/othervm MissingDragExitEventTest
* @author Sergey Bylokhov
*/
import
java.awt.Color
;
import
java.awt.Point
;
import
java.awt.Robot
;
import
java.awt.Toolkit
;
import
java.awt.dnd.DnDConstants
;
import
java.awt.dnd.DropTarget
;
import
java.awt.dnd.DropTargetAdapter
;
import
java.awt.dnd.DropTargetDragEvent
;
import
java.awt.dnd.DropTargetDropEvent
;
import
java.awt.dnd.DropTargetEvent
;
import
java.awt.event.InputEvent
;
import
java.awt.event.MouseAdapter
;
import
java.awt.event.MouseEvent
;
import
javax.swing.JFrame
;
import
javax.swing.JTextArea
;
import
javax.swing.SwingUtilities
;
import
sun.awt.SunToolkit
;
import
test.java.awt.regtesthelpers.Util
;
public
class
MissingDragExitEventTest
{
private
static
volatile
JFrame
frame
;
private
static
boolean
FAILED
;
private
static
boolean
MOUSE_ENTERED_DT
;
private
static
boolean
MOUSE_ENTERED
;
private
static
boolean
MOUSE_EXIT_TD
;
private
static
boolean
MOUSE_EXIT
;
private
static
int
SIZE
=
300
;
private
static
void
initAndShowUI
()
{
frame
=
new
JFrame
(
"Test frame"
);
frame
.
setSize
(
SIZE
,
SIZE
);
frame
.
setLocationRelativeTo
(
null
);
final
JTextArea
jta
=
new
JTextArea
();
jta
.
setBackground
(
Color
.
RED
);
frame
.
add
(
jta
);
jta
.
setText
(
"1234567890"
);
jta
.
setFont
(
jta
.
getFont
().
deriveFont
(
150
f
));
jta
.
setDragEnabled
(
true
);
jta
.
selectAll
();
jta
.
setDropTarget
(
new
DropTarget
(
jta
,
DnDConstants
.
ACTION_COPY
,
new
TestdropTargetListener
()));
jta
.
addMouseListener
(
new
TestMouseAdapter
());
frame
.
setVisible
(
true
);
}
public
static
void
main
(
final
String
[]
args
)
throws
Exception
{
try
{
final
Robot
r
=
new
Robot
();
r
.
setAutoDelay
(
50
);
r
.
mouseMove
(
100
,
100
);
Util
.
waitForIdle
(
r
);
SwingUtilities
.
invokeAndWait
(
new
Runnable
()
{
@Override
public
void
run
()
{
initAndShowUI
();
}
});
final
Point
inside
=
new
Point
(
frame
.
getLocationOnScreen
());
inside
.
translate
(
20
,
SIZE
/
2
);
final
Point
outer
=
new
Point
(
inside
);
outer
.
translate
(-
40
,
0
);
r
.
mouseMove
(
inside
.
x
,
inside
.
y
);
r
.
mousePress
(
InputEvent
.
BUTTON1_MASK
);
try
{
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
Util
.
mouseMove
(
r
,
inside
,
outer
);
Util
.
mouseMove
(
r
,
outer
,
inside
);
}
}
finally
{
r
.
mouseRelease
(
InputEvent
.
BUTTON1_MASK
);
}
sleep
();
if
(
FAILED
||
!
MOUSE_ENTERED
||
!
MOUSE_ENTERED_DT
||
!
MOUSE_EXIT
||
!
MOUSE_EXIT_TD
)
{
throw
new
RuntimeException
(
"Failed"
);
}
}
finally
{
if
(
frame
!=
null
)
{
frame
.
dispose
();
}
}
}
private
static
void
sleep
()
{
try
{
Thread
.
sleep
(
10000
);
}
catch
(
InterruptedException
ignored
)
{
}
((
SunToolkit
)
Toolkit
.
getDefaultToolkit
()).
realSync
();
}
static
class
TestdropTargetListener
extends
DropTargetAdapter
{
private
volatile
boolean
inside
;
@Override
public
void
dragEnter
(
final
DropTargetDragEvent
dtde
)
{
if
(
inside
)
{
FAILED
=
true
;
Thread
.
dumpStack
();
}
inside
=
true
;
MOUSE_ENTERED_DT
=
true
;
try
{
Thread
.
sleep
(
10000
);
// we should have time to leave a component
}
catch
(
InterruptedException
ignored
)
{
}
}
@Override
public
void
dragOver
(
final
DropTargetDragEvent
dtde
)
{
if
(!
inside
)
{
FAILED
=
true
;
Thread
.
dumpStack
();
}
}
@Override
public
void
dragExit
(
final
DropTargetEvent
dte
)
{
if
(!
inside
)
{
FAILED
=
true
;
Thread
.
dumpStack
();
}
inside
=
false
;
MOUSE_EXIT_TD
=
true
;
}
@Override
public
void
drop
(
final
DropTargetDropEvent
dtde
)
{
if
(!
inside
)
{
FAILED
=
true
;
Thread
.
dumpStack
();
}
inside
=
false
;
}
}
static
class
TestMouseAdapter
extends
MouseAdapter
{
private
volatile
boolean
inside
;
@Override
public
void
mouseEntered
(
final
MouseEvent
e
)
{
if
(
inside
)
{
FAILED
=
true
;
Thread
.
dumpStack
();
}
inside
=
true
;
MOUSE_ENTERED
=
true
;
}
@Override
public
void
mouseExited
(
final
MouseEvent
e
)
{
if
(!
inside
)
{
FAILED
=
true
;
Thread
.
dumpStack
();
}
inside
=
false
;
MOUSE_EXIT
=
true
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录