Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
-学无止境
dbeaver
提交
b5e22b2e
D
dbeaver
项目概览
-学无止境
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
18
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b5e22b2e
编写于
7月 18, 2019
作者:
S
Serge Rider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#5384 FK create dialog: container selector.
上级
316121d0
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
164 addition
and
71 deletion
+164
-71
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/page/DatabaseConsumerPageMapping.java
...s/transfer/database/page/DatabaseConsumerPageMapping.java
+1
-1
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/runtime/DBRValueProvider.java
...src/org/jkiss/dbeaver/model/runtime/DBRValueProvider.java
+28
-0
plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java
.../dbeaver/ui/editors/object/struct/EditForeignKeyPage.java
+72
-32
plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java
...s/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java
+5
-17
plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java
...rg.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java
+26
-0
plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/ObjectContainerSelectorPanel.java
...iss/dbeaver/ui/controls/ObjectContainerSelectorPanel.java
+32
-21
未找到文件。
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/page/DatabaseConsumerPageMapping.java
浏览文件 @
b5e22b2e
...
...
@@ -104,7 +104,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
{
// Target container
// Use first source object as cur selection (it's better than nothing)
containerPanel
=
new
ObjectContainerSelectorPanel
(
composite
,
DTMessages
.
data_transfer_db_consumer_target_container
)
{
containerPanel
=
new
ObjectContainerSelectorPanel
(
composite
,
DTMessages
.
data_transfer_db_consumer_target_container
,
DTMessages
.
data_transfer_db_consumer_choose_container
)
{
@Nullable
@Override
protected
DBNNode
getSelectedNode
()
{
...
...
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/runtime/DBRValueProvider.java
0 → 100644
浏览文件 @
b5e22b2e
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.jkiss.dbeaver.model.runtime
;
/**
* Abstract value provider
*/
@FunctionalInterface
public
interface
DBRValueProvider
<
RESULT
,
PARAMETER
>
{
RESULT
getValue
(
PARAMETER
parameter
);
}
\ No newline at end of file
plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java
浏览文件 @
b5e22b2e
...
...
@@ -30,13 +30,12 @@ import org.eclipse.swt.widgets.*;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.Log
;
import
org.jkiss.dbeaver.model.DBPDataSourceInfo
;
import
org.jkiss.dbeaver.model.DBPEvaluationContext
;
import
org.jkiss.dbeaver.model.DBUtils
;
import
org.jkiss.dbeaver.model.DBValueFormatting
;
import
org.jkiss.dbeaver.model.*
;
import
org.jkiss.dbeaver.model.navigator.DBNDatabaseFolder
;
import
org.jkiss.dbeaver.model.navigator.DBNDatabaseNode
;
import
org.jkiss.dbeaver.model.navigator.DBNNode
;
import
org.jkiss.dbeaver.model.navigator.meta.DBXTreeNode
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.model.struct.*
;
import
org.jkiss.dbeaver.model.struct.rdb.*
;
...
...
@@ -87,7 +86,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
private
DBSForeignKeyModifyRule
[]
supportedModifyRules
;
private
DBSEntityAssociation
foreignKey
;
private
DBS
Table
curRefTable
;
private
DBS
Entity
curRefTable
;
private
List
<
DBSEntityConstraint
>
curConstraints
;
private
DBNDatabaseNode
ownerTableNode
;
private
Table
tableList
;
...
...
@@ -321,7 +320,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
}
private
void
createContainerSelector
(
Composite
tableGroup
)
throws
DBException
{
ObjectContainerSelectorPanel
containerPanel
=
new
ObjectContainerSelectorPanel
(
tableGroup
,
"Reference table container"
)
{
ObjectContainerSelectorPanel
containerPanel
=
new
ObjectContainerSelectorPanel
(
tableGroup
,
"Reference table container"
,
"Select reference table catalog/schema"
)
{
@Nullable
@Override
protected
DBNNode
getSelectedNode
()
{
...
...
@@ -332,7 +331,12 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
@Override
protected
void
setSelectedNode
(
DBNDatabaseNode
node
)
{
ownerTableNode
=
node
;
setContainerInfo
(
node
.
getNodeIconDefault
(),
node
.
getNodeFullName
());
if
(
node
==
null
)
{
setContainerInfo
(
DBIcon
.
TYPE_UNKNOWN
,
""
);
}
else
{
setContainerInfo
(
node
.
getNodeIconDefault
(),
node
.
getNodeFullName
());
loadTableList
(
ownerTableNode
);
}
}
};
GridData
gd
=
new
GridData
(
GridData
.
FILL_HORIZONTAL
);
...
...
@@ -342,28 +346,55 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
private
void
loadTableList
(
DBNDatabaseNode
newContainerNode
)
{
tableList
.
removeAll
();
final
List
<
DBNDatabaseNode
>
entities
=
new
ArrayList
<>();
try
{
for
(
DBNNode
tableNode
:
newContainerNode
.
getChildren
(
new
VoidProgressMonitor
()))
{
if
(
tableNode
instanceof
DBNDatabaseNode
&&
((
DBNDatabaseNode
)
tableNode
).
getObject
()
instanceof
DBSEntity
)
{
TableItem
tableItem
=
new
TableItem
(
tableList
,
SWT
.
LEFT
);
tableItem
.
setText
(
tableNode
.
getNodeName
());
tableItem
.
setImage
(
DBeaverIcons
.
getImage
(
tableNode
.
getNodeIconDefault
()));
tableItem
.
setData
(
tableNode
);
UIUtils
.
runInProgressDialog
(
monitor
->
{
try
{
loadEntities
(
monitor
,
entities
,
newContainerNode
);
}
catch
(
DBException
e
)
{
throw
new
InvocationTargetException
(
e
);
}
});
}
catch
(
InvocationTargetException
e
)
{
DBWorkbench
.
getPlatformUI
().
showError
(
"Error loading tables"
,
"Error during table load"
,
e
);
}
for
(
DBNDatabaseNode
entityNode
:
entities
)
{
TableItem
tableItem
=
new
TableItem
(
tableList
,
SWT
.
LEFT
);
tableItem
.
setText
(
entityNode
.
getNodeName
());
tableItem
.
setImage
(
DBeaverIcons
.
getImage
(
entityNode
.
getNodeIconDefault
()));
tableItem
.
setData
(
entityNode
);
}
}
private
void
loadEntities
(
DBRProgressMonitor
monitor
,
List
<
DBNDatabaseNode
>
entities
,
DBNDatabaseNode
container
)
throws
DBException
{
for
(
DBNNode
childNode
:
container
.
getChildren
(
monitor
))
{
if
(
monitor
.
isCanceled
())
{
break
;
}
if
(
childNode
instanceof
DBNDatabaseFolder
)
{
loadEntities
(
monitor
,
entities
,
(
DBNDatabaseFolder
)
childNode
);
}
else
{
if
(
childNode
instanceof
DBNDatabaseNode
)
{
DBSObject
object
=
((
DBNDatabaseNode
)
childNode
).
getObject
();
// Extr checks. In fact just for PosgreSQL like databases where everything is a table
if
(
object
instanceof
DBSEntity
&&
!(
object
instanceof
DBSSequence
)
&&
!(
object
instanceof
DBSDataType
))
{
entities
.
add
((
DBNDatabaseNode
)
childNode
);
}
}
}
}
catch
(
DBException
e
)
{
log
.
error
(
e
);
}
}
private
void
handleRefTableSelect
(
DBNDatabaseNode
refTableNode
)
{
if
(
refTableNode
!=
null
)
{
if
(
refTableNode
.
getObject
()
==
curRefTable
)
{
DBSObject
object
=
refTableNode
.
getObject
();
if
(
object
==
curRefTable
)
{
// The same selection
return
;
}
else
{
curRefTable
=
(
DBS
Table
)
refTableNode
.
getObject
();
}
else
if
(
object
instanceof
DBSEntity
)
{
curRefTable
=
(
DBS
Entity
)
refTableNode
.
getObject
();
}
if
(
fkNameText
!=
null
)
{
fkNameText
.
setText
(
"FK_"
+
refTableNode
.
getObject
().
getName
());
...
...
@@ -376,7 +407,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
curConstraints
=
new
ArrayList
<>();
curConstraint
=
null
;
if
(
refTableNode
!=
null
)
{
final
DBS
Table
refTable
=
(
DBSTable
)
refTableNode
.
getObject
();
final
DBS
Entity
refTable
=
(
DBSEntity
)
refTableNode
.
getObject
();
UIUtils
.
runInProgressService
(
monitor
->
{
try
{
// Cache own table columns
...
...
@@ -386,21 +417,23 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
refTable
.
getAttributes
(
monitor
);
// Get constraints
final
Collection
<?
extends
DBS
Table
Constraint
>
constraints
=
refTable
.
getConstraints
(
monitor
);
final
Collection
<?
extends
DBS
Entity
Constraint
>
constraints
=
refTable
.
getConstraints
(
monitor
);
if
(!
CommonUtils
.
isEmpty
(
constraints
))
{
for
(
DBS
Table
Constraint
constraint
:
constraints
)
{
for
(
DBS
Entity
Constraint
constraint
:
constraints
)
{
if
(
constraint
.
getConstraintType
().
isUnique
())
{
curConstraints
.
add
(
constraint
);
}
}
}
// Get indexes
final
Collection
<?
extends
DBSTableIndex
>
indexes
=
refTable
.
getIndexes
(
monitor
);
if
(!
CommonUtils
.
isEmpty
(
indexes
))
{
for
(
DBSTableIndex
constraint
:
indexes
)
{
if
(
constraint
.
getConstraintType
().
isUnique
())
{
curConstraints
.
add
(
constraint
);
if
(
refTable
instanceof
DBSTable
)
{
// Get indexes
final
Collection
<?
extends
DBSTableIndex
>
indexes
=
((
DBSTable
)
refTable
).
getIndexes
(
monitor
);
if
(!
CommonUtils
.
isEmpty
(
indexes
))
{
for
(
DBSTableIndex
constraint
:
indexes
)
{
if
(
constraint
.
getConstraintType
().
isUnique
())
{
curConstraints
.
add
(
constraint
);
}
}
}
}
...
...
@@ -589,11 +622,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
public
void
widgetSelected
(
SelectionEvent
e
)
{
if
(
columnsCombo
.
getSelectionIndex
()
>=
0
)
{
fkInfo
.
ownColumn
=
ownColumns
.
get
(
columnsCombo
.
getSelectionIndex
());
item
.
setText
(
0
,
fkInfo
.
ownColumn
.
getName
());
item
.
setImage
(
0
,
getColumnIcon
(
fkInfo
.
ownColumn
));
item
.
setText
(
1
,
fkInfo
.
ownColumn
.
getFullTypeName
());
updatePageState
();
assignForeignKeyRefConstraint
(
fkInfo
,
columnsCombo
,
item
);
}
}
});
...
...
@@ -601,6 +630,9 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
@Override
public
void
focusLost
(
FocusEvent
e
)
{
if
(
columnsCombo
.
getSelectionIndex
()
>=
0
)
{
assignForeignKeyRefConstraint
(
fkInfo
,
columnsCombo
,
item
);
}
disposeOldEditor
();
}
});
...
...
@@ -608,6 +640,14 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
}
}
private
void
assignForeignKeyRefConstraint
(
FKColumnInfo
fkInfo
,
CCombo
columnsCombo
,
TableItem
item
)
{
fkInfo
.
ownColumn
=
ownColumns
.
get
(
columnsCombo
.
getSelectionIndex
());
item
.
setText
(
0
,
fkInfo
.
ownColumn
.
getName
());
item
.
setImage
(
0
,
getColumnIcon
(
fkInfo
.
ownColumn
));
item
.
setText
(
1
,
fkInfo
.
ownColumn
.
getFullTypeName
());
updatePageState
();
}
public
boolean
isEnabled
()
{
return
true
;
}
...
...
plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java
浏览文件 @
b5e22b2e
...
...
@@ -104,7 +104,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
private
final
Color
hoverBgColor
;
private
final
Color
shadowColor
;
private
final
GC
sizingGC
;
private
final
Font
hintFont
;
private
String
activeDisplayName
=
ResultSetViewer
.
DEFAULT_QUERY_TEXT
;
...
...
@@ -127,7 +126,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
this
.
hoverBgColor
=
getDisplay
().
getSystemColor
(
SWT
.
COLOR_WIDGET_LIGHT_SHADOW
);
this
.
shadowColor
=
getDisplay
().
getSystemColor
(
SWT
.
COLOR_WIDGET_NORMAL_SHADOW
);
this
.
hintFont
=
UIUtils
.
modifyFont
(
getFont
(),
SWT
.
ITALIC
);
{
this
.
filterComposite
=
new
Composite
(
this
,
SWT
.
BORDER
);
...
...
@@ -163,20 +161,11 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
// Register filters text in focus service
UIUtils
.
addDefaultEditActionsSupport
(
viewer
.
getSite
(),
this
.
filtersText
);
this
.
filtersText
.
addPaintListener
(
e
->
{
/*if (viewer.getModel().hasData())*/
{
final
boolean
supportsDataFilter
=
viewer
.
supportsDataFilter
();
if
(!
supportsDataFilter
||
(
filtersText
.
isEnabled
()
&&
filtersText
.
getCharCount
()
==
0
&&
!
filtersText
.
isFocusControl
()))
{
e
.
gc
.
setForeground
(
shadowColor
);
e
.
gc
.
setFont
(
hintFont
);
e
.
gc
.
drawText
(
supportsDataFilter
?
ResultSetMessages
.
sql_editor_resultset_filter_panel_text_enter_sql_to_filter
:
ResultSetMessages
.
sql_editor_resultset_filter_panel_text_enter_filter_not_support
,
2
,
0
,
true
);
e
.
gc
.
setFont
(
null
);
}
}
});
UIUtils
.
addEmptyTextHint
(
this
.
filtersText
,
styledText
->
viewer
.
supportsDataFilter
()
?
ResultSetMessages
.
sql_editor_resultset_filter_panel_text_enter_sql_to_filter
:
ResultSetMessages
.
sql_editor_resultset_filter_panel_text_enter_filter_not_support
);
this
.
filtersText
.
addFocusListener
(
new
FocusListener
()
{
@Override
public
void
focusGained
(
FocusEvent
e
)
{
...
...
@@ -349,7 +338,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
historyMenu
=
null
;
}
UIUtils
.
dispose
(
sizingGC
);
UIUtils
.
dispose
(
hintFont
);
});
}
...
...
plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java
浏览文件 @
b5e22b2e
...
...
@@ -44,6 +44,7 @@ import org.eclipse.swt.SWT;
import
org.eclipse.swt.custom.CLabel
;
import
org.eclipse.swt.custom.CTabFolder
;
import
org.eclipse.swt.custom.CTabItem
;
import
org.eclipse.swt.custom.StyledText
;
import
org.eclipse.swt.dnd.Clipboard
;
import
org.eclipse.swt.dnd.TextTransfer
;
import
org.eclipse.swt.dnd.Transfer
;
...
...
@@ -1891,4 +1892,29 @@ public class UIUtils {
}
}
}
public
static
<
T
extends
Control
>
void
addEmptyTextHint
(
T
control
,
DBRValueProvider
<
String
,
T
>
tipProvider
)
{
control
.
addPaintListener
(
new
PaintListener
()
{
private
Font
hintFont
=
UIUtils
.
modifyFont
(
control
.
getFont
(),
SWT
.
ITALIC
);
{
control
.
addDisposeListener
(
e
->
hintFont
.
dispose
());
}
@Override
public
void
paintControl
(
PaintEvent
e
)
{
String
tip
=
tipProvider
.
getValue
(
control
);
if
(
tip
!=
null
&&
(
control
.
isEnabled
()
&&
isEmptyTextControl
(
control
)
&&
!
control
.
isFocusControl
()))
{
e
.
gc
.
setForeground
(
getDisplay
().
getSystemColor
(
SWT
.
COLOR_WIDGET_NORMAL_SHADOW
));
e
.
gc
.
setFont
(
hintFont
);
e
.
gc
.
drawText
(
tip
,
2
,
0
,
true
);
e
.
gc
.
setFont
(
null
);
}
}
});
}
private
static
boolean
isEmptyTextControl
(
Control
control
)
{
return
control
instanceof
Text
?
((
Text
)
control
).
getCharCount
()
==
0
:
control
instanceof
StyledText
&&
((
StyledText
)
control
).
getCharCount
()
==
0
;
}
}
plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/ObjectContainerSelectorPanel.java
浏览文件 @
b5e22b2e
...
...
@@ -18,8 +18,7 @@
package
org.jkiss.dbeaver.ui.controls
;
import
org.eclipse.swt.SWT
;
import
org.eclipse.swt.events.SelectionAdapter
;
import
org.eclipse.swt.events.SelectionEvent
;
import
org.eclipse.swt.events.*
;
import
org.eclipse.swt.layout.GridData
;
import
org.eclipse.swt.layout.GridLayout
;
import
org.eclipse.swt.widgets.Button
;
...
...
@@ -49,7 +48,7 @@ public abstract class ObjectContainerSelectorPanel extends Composite
private
final
Label
containerIcon
;
private
final
Text
containerName
;
protected
ObjectContainerSelectorPanel
(
Composite
parent
,
String
containerTitle
)
{
protected
ObjectContainerSelectorPanel
(
Composite
parent
,
String
containerTitle
,
String
containerHint
)
{
super
(
parent
,
SWT
.
NONE
);
GridLayout
layout
=
new
GridLayout
(
4
,
false
);
...
...
@@ -65,30 +64,42 @@ public abstract class ObjectContainerSelectorPanel extends Composite
containerName
=
new
Text
(
this
,
SWT
.
BORDER
|
SWT
.
READ_ONLY
);
containerName
.
setLayoutData
(
new
GridData
(
GridData
.
FILL_HORIZONTAL
));
containerName
.
setText
(
""
);
if
(
containerHint
!=
null
)
{
UIUtils
.
addEmptyTextHint
(
containerName
,
text
->
containerHint
);
}
Button
browseButton
=
new
Button
(
this
,
SWT
.
PUSH
);
browseButton
.
setImage
(
DBeaverIcons
.
getImage
(
DBIcon
.
TREE_FOLDER
));
browseButton
.
setText
(
"..."
);
Runnable
containerSelector
=
()
->
{
DBPProject
activeProject
=
DBWorkbench
.
getPlatform
().
getWorkspace
().
getActiveProject
();
if
(
activeProject
!=
null
)
{
final
DBNModel
navigatorModel
=
DBWorkbench
.
getPlatform
().
getNavigatorModel
();
final
DBNProject
rootNode
=
navigatorModel
.
getRoot
().
getProjectNode
(
activeProject
);
DBNNode
selectedNode
=
getSelectedNode
();
DBNNode
node
=
DBWorkbench
.
getPlatformUI
().
selectObject
(
getShell
(),
containerHint
!=
null
?
containerHint
:
containerTitle
,
rootNode
.
getDatabases
(),
selectedNode
,
new
Class
[]{
DBSObjectContainer
.
class
},
null
,
//new Class[] { DBSObjectContainer.class },
new
Class
[]{
DBSSchema
.
class
});
if
(
node
instanceof
DBNDatabaseNode
)
{
setSelectedNode
((
DBNDatabaseNode
)
node
);
}
}
};
browseButton
.
addSelectionListener
(
new
SelectionAdapter
()
{
@Override
public
void
widgetSelected
(
SelectionEvent
e
)
{
DBPProject
activeProject
=
DBWorkbench
.
getPlatform
().
getWorkspace
().
getActiveProject
();
if
(
activeProject
!=
null
)
{
final
DBNModel
navigatorModel
=
DBWorkbench
.
getPlatform
().
getNavigatorModel
();
final
DBNProject
rootNode
=
navigatorModel
.
getRoot
().
getProjectNode
(
activeProject
);
DBNNode
selectedNode
=
getSelectedNode
();
DBNNode
node
=
DBWorkbench
.
getPlatformUI
().
selectObject
(
getShell
(),
containerTitle
,
rootNode
.
getDatabases
(),
selectedNode
,
new
Class
[]
{
DBSObjectContainer
.
class
},
null
,
new
Class
[]
{
DBSSchema
.
class
});
if
(
node
instanceof
DBNDatabaseNode
)
{
setSelectedNode
((
DBNDatabaseNode
)
node
);
}
}
public
void
widgetSelected
(
SelectionEvent
e
)
{
containerSelector
.
run
();
}
});
containerName
.
addMouseListener
(
new
MouseAdapter
()
{
@Override
public
void
mouseDoubleClick
(
MouseEvent
e
)
{
containerSelector
.
run
();
}
});
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录