Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT FlexTable-如何拖动选择?_Gwt - Fatal编程技术网

GWT FlexTable-如何拖动选择?

GWT FlexTable-如何拖动选择?,gwt,Gwt,我正试图找到一种适合数天的方法来选择flextable列中的多个单元格 到目前为止,我只能通过点击来完成,效果很好,但拖动选择会更好。我一直在阅读文档和搜索,但我找到的所有东西都是基于不推荐的代码。我使用GWT2.0 我知道我需要一些事件处理程序,当出现拖动选择鼠标手势时,它将运行,并且该处理程序需要知道选择开始的单元格索引以及选择结束的单元格索引 任何建议| |代码都将不胜感激。这需要改进,但它应该能给你基本的想法。首先,您需要创建一个侦听MouseEvents的CustomTable。您可以

我正试图找到一种适合数天的方法来选择flextable列中的多个单元格

到目前为止,我只能通过点击来完成,效果很好,但拖动选择会更好。我一直在阅读文档和搜索,但我找到的所有东西都是基于不推荐的代码。我使用GWT2.0

我知道我需要一些事件处理程序,当出现拖动选择鼠标手势时,它将运行,并且该处理程序需要知道选择开始的单元格索引以及选择结束的单元格索引


任何建议| |代码都将不胜感激。

这需要改进,但它应该能给你基本的想法。首先,您需要创建一个侦听MouseEvents的CustomTable。您可以通过扩展composite来包装focuspanel和flextable,如下所示:

public class CustomTable extends Composite implements MouseDownHandler, MouseMoveHandler, MouseUpHandler{

List<CellWidget> widgets = new ArrayList<CellWidget>();
FlexTable table = new FlexTable();
FocusPanel focusPanel = new FocusPanel();
boolean selecting= false;
Point selectStart,selectEnd;    

public CustomTable(){
    focusPanel.setWidget(table);
    focusPanel.addMouseDownHandler(this);
    focusPanel.addMouseMoveHandler(this);
    focusPanel.addMouseUpHandler(this);

    initWidget(focusPanel);
}

public void setWidget(int row, int column, CellWidget widget){
    widgets.add(widget);
    table.setWidget(row, column, widget);
}

@Override
public void onMouseUp(MouseUpEvent event) {
    event.preventDefault();
    if (selecting){
        selecting=false;
        DOM.releaseCapture(this.getElement());
        selectEnd = new Point(event.getClientX(),event.getClientY());

        for (CellWidget widget : widgets){
            if (widget.isIn(selectStart,selectEnd))
                widget.say();               
        }
        selectStart = selectEnd = null;         
    }       
}

@Override
public void onMouseMove(MouseMoveEvent event) {
    event.preventDefault();
    if (selecting){
        //do some fancy layout
    }       
}

@Override
public void onMouseDown(MouseDownEvent event) {
    event.preventDefault();
    selecting = true;
    DOM.setCapture(this.getElement());  
    selectStart = new Point(event.getClientX(),event.getClientY());
}   
}
一个简单的点实现使事情变得更简单:

public class Point {

int x,y;

public Point(int x,int y){
    this.x=x;
    this.y=y;
}   
public int getX() {
    return x;
}
public int getY() {
    return y;
}
@Override
public String toString() {
    return x+","+y;
}
public boolean isBetween(Point p1,Point p2){
    if (p1.getX() < x && p2.getX() > x && p1.getY() < y && p2.getY() > y)
        return true;
    return false;
}
}

我知道确定小部件是否属于所选区域的实际逻辑是不完整的,需要改进,但我认为这个解决方案足够清晰,可以给出基本的想法。干杯

这需要改进,但它应该给你一个基本的想法。首先,您需要创建一个侦听MouseEvents的CustomTable。您可以通过扩展composite来包装focuspanel和flextable,如下所示:

public class CustomTable extends Composite implements MouseDownHandler, MouseMoveHandler, MouseUpHandler{

List<CellWidget> widgets = new ArrayList<CellWidget>();
FlexTable table = new FlexTable();
FocusPanel focusPanel = new FocusPanel();
boolean selecting= false;
Point selectStart,selectEnd;    

public CustomTable(){
    focusPanel.setWidget(table);
    focusPanel.addMouseDownHandler(this);
    focusPanel.addMouseMoveHandler(this);
    focusPanel.addMouseUpHandler(this);

    initWidget(focusPanel);
}

public void setWidget(int row, int column, CellWidget widget){
    widgets.add(widget);
    table.setWidget(row, column, widget);
}

@Override
public void onMouseUp(MouseUpEvent event) {
    event.preventDefault();
    if (selecting){
        selecting=false;
        DOM.releaseCapture(this.getElement());
        selectEnd = new Point(event.getClientX(),event.getClientY());

        for (CellWidget widget : widgets){
            if (widget.isIn(selectStart,selectEnd))
                widget.say();               
        }
        selectStart = selectEnd = null;         
    }       
}

@Override
public void onMouseMove(MouseMoveEvent event) {
    event.preventDefault();
    if (selecting){
        //do some fancy layout
    }       
}

@Override
public void onMouseDown(MouseDownEvent event) {
    event.preventDefault();
    selecting = true;
    DOM.setCapture(this.getElement());  
    selectStart = new Point(event.getClientX(),event.getClientY());
}   
}
一个简单的点实现使事情变得更简单:

public class Point {

int x,y;

public Point(int x,int y){
    this.x=x;
    this.y=y;
}   
public int getX() {
    return x;
}
public int getY() {
    return y;
}
@Override
public String toString() {
    return x+","+y;
}
public boolean isBetween(Point p1,Point p2){
    if (p1.getX() < x && p2.getX() > x && p1.getY() < y && p2.getY() > y)
        return true;
    return false;
}
}

我知道确定小部件是否属于所选区域的实际逻辑是不完整的,需要改进,但我认为这个解决方案足够清晰,可以给出基本的想法。干杯

你看过gwt dnd()吗?是的,我也找到了gwt dnd。我看过演示和wiki,它们支持各种拖放功能,但不支持拖放选择。我仍在寻找解决方案。你看过gwt dnd()吗?是的,我也找到了gwt dnd。我看了演示和wiki,它们支持各种拖放功能,但不支持拖放选择。我仍在寻找解决方案。