【发布时间】:2014-11-04 11:24:05
【问题描述】:
大家好 Stackoverflow !
我正在为项目管理工具实现 Java RCP 插件,使用 SWT 并接近 MVC 逻辑。
我需要制作一种时序时间表,其中可以拖放里程碑(项目管理中的某种截止日期事件)。
我使用几个 SWT 标签实现了这一点(基本上,水平线上的 36 个标签数组,一年中每月 3 个)。
这是实际 GUI 的屏幕截图:
用户必须从拖动标签(左侧的 (X))中拖动里程碑,并将其放在所需的标签/月份的部分上。然后,目前唯一的作用是将放置目标标签的文本字段设置为 (X)。
我创建了 2 个“模型”类:一个 Milestone 类(稍后将使用其他元素进行改进,例如有关在此日期必须完成的项目的信息)和一个类 Square(广场有与放置标签链接)。 Square 类的特点:
- boolean isEmpty(检查标签或方块是否已经有里程碑)
- int nbMilestone(标签/正方形上的里程碑数)
- int id(0到35之间的标签或方块的编号)
里程碑类功能:
- 年份(获取当前年份)
- positionId(里程碑被放置在哪个标签或方块上)
我想要的是当用户在标签上拖放里程碑时,它会更新 Milestone 和 Square 类,至少包含位置信息。我很难获得信息用户在哪个标签上放弃了里程碑?。
这 36 个标签是在 for(;;) 循环中创建的,在此循环中包含一些拖放侦听器。
编辑#2:这是我的实际代码:
// Drag source label in order to create milestones by a Drag'n'Drop
// operation
final Label milestone_drag_label = new Label(compA, SWT.NONE);
milestone_drag_label.setText("(X)");
milestone_drag_label.setData("milestone", milestone);
// Setting up the Drag Listener for the milestone label
DragSource ds_ms_label = new DragSource(milestone_drag_label,
DND.DROP_MOVE);
ds_ms_label.setTransfer(new Transfer[] { TextTransfer.getInstance() });
ds_ms_label.addDragListener(new DragSourceAdapter() {
public void dragSetData(DragSourceEvent event) {
// event.data = milestone_drag_label.getText();
event.data = (Milestone) event.widget.getData("milestone");
from_ms_label = true;
}
});
// Display configuration for the labels (3 labels per months, so they're
// called
// third, as third of a month)
GridData gd_third = new GridData();
gd_third.grabExcessHorizontalSpace = true;
gd_third.widthHint = 15;
for (w = 0; w < 36; w++) {
final Label third = new Label(compA, SWT.BORDER);
third.setLayoutData(gd_third);
board[w] = third;
square[w] = new Square();
square[w].setId(w);
third.setData("square", square);
DropTarget dt = new DropTarget(board[w], DND.DROP_MOVE);
// DropTarget dt = new DropTarget(third, DND.DROP_MOVE);
dt.setTransfer(new Transfer[] { TextTransfer.getInstance() });
dt.addDropListener(new DropTargetAdapter() {
public void drop(DropTargetEvent event) {
if (event.data == null) {
event.detail = DND.DROP_NONE;
} else {
// third.setText((String) event.data);
Milestone milestone = (Milestone) event.data;
Square square = event.widget.getData("square");
milestone.setPositionId(square.getId());
printMilestone(milestone);
}
}
});
printMilestone() 方法最后只是将属性 year 和 positionId 写入 .txt 文件。
我在线路上遇到错误:Square square = event.widget.getData("square");
所以我添加了演员表:Square square = (Square) event.widget.getData("square");
但是当我运行我的 RichClient 应用程序时,我收到了这个错误:
org.eclipse.swt.SWTException:数据的格式不正确 输入
【问题讨论】:
-
“标签文本字段上的添加修饰符”是什么意思?每个可能的放置目标都由一个
Label小部件表示,对吧?还是您使用Text小部件? -
是的,我使用 36 个标签作为放置目标(全部在一行中)。这样声明:Label[] board = new Label[36];然后在 drawView() 方法中,我使用 for(;;) 循环实例化这 36 个标签,每次创建一个拖放侦听器。我想将这些标签链接到我的 Square 和 Milestone bean。换句话说,如何获取有关里程碑已被删除的标签的信息?
-
third.setData("square", square);应该是third.setData("square", square[w]);
标签: java drag-and-drop swt rcp