1

フレックステーブルの列をサイズ変更可能にしようとしています。したがって、ユーザーは列の幅を決定できます。1 つの解決策は、css の resize プロパティを使用することですが、これは IE では機能しません。IEでこれを機能させる方法を知っている人はいますか?

私の考えは、 onBrowserEvent をキャッチしていくつかのマウスハンドラーを登録することでしたが、サイズを変更する適切な要素が得られません。

あなたが私を助けてくれることを願っています。前もって感謝します!

4

1 に答える 1

1

こんにちは、私は自分自身の解決策を見つけました。多分これは誰かを助けることができます。

 public class ResizableFlexTable
    extends FlexTable
{
  private int mouseDownX;
  private boolean mouseDown;
  private int columnWidth;
  private TableCellElement headerElem;
  private int column;
  private ResizeMode resizeMode;

  /**
   * 
   */
  public ResizableFlexTable()
  {
    super();
    sinkEvents( Event.ONMOUSEMOVE );
    sinkEvents( Event.ONMOUSEDOWN );
    sinkEvents( Event.ONMOUSEUP );
    sinkEvents( Event.ONCLICK );
    Event.setEventListener( getElement(), this );
  }

  @Override
  public void onBrowserEvent( Event event )
  {
    if ( event.getType().equals( "change" ) )
    {
      super.onBrowserEvent( event );
      return;
    }

    boolean eventMouseUp = event.getType().equals( "mouseup" );
    boolean eventClick = event.getType().equals( "click" );
    boolean eventMouseDown = event.getType().equals( "mousedown" );
    boolean eventMouseMove = event.getType().equals( "mousemove" );

    if ( eventMouseUp )
    {
      mouseDownX = -1;
      mouseDown = false;
    }
    if ( resizeMode == ResizeMode.RESIZING && eventClick )
    {
      resizeMode = ResizeMode.ENDING;
    }

    TableCellElement tableCellElement = findNearestParentCell( (Element) event.getEventTarget()
        .cast() );
    if ( tableCellElement == null )
    {
      super.onBrowserEvent( event );
      return;
    }

    Element trElem = tableCellElement.getParentElement();
    if ( trElem == null )
    {
      super.onBrowserEvent( event );
      return;
    }
    TableRowElement tr = TableRowElement.as( trElem );
    // Element sectionElem = tr.getParentElement();
    if ( tr == null )
    {
      super.onBrowserEvent( event );
      return;
    }

    int col = tableCellElement.getCellIndex();
    if ( tr == getTableHeadElement() )
    {
      int mouseX = event.getClientX();
      int right = tableCellElement.getAbsoluteLeft() + tableCellElement.getOffsetWidth();
      if ( !mouseDown && eventMouseDown )
      {
        if ( mouseX <= right && mouseX >= right - 10 )
        {
          headerElem = tableCellElement;
          column = col;
          mouseDownX = event.getClientX();
          mouseDown = true;
          columnWidth = headerElem.getOffsetWidth();
        }
      }
      else if ( eventMouseMove )
      {
        if ( mouseDown || mouseX <= right && mouseX >= right - 10 )
        {
          tableCellElement.getStyle().setCursor( Cursor.COL_RESIZE );
        }
        else
        {
          tableCellElement.getStyle().setCursor( Cursor.AUTO );
        }
      }
    }
    else
    {
      super.onBrowserEvent( event );
    }

    if ( headerElem != null && eventMouseMove && mouseDown )
    {
      int move = event.getClientX() - mouseDownX;
      @SuppressWarnings ( "hiding")
      int columnWidth = this.columnWidth + move;
      if ( columnWidth > 24 )
      {
        getColumnFormatter().getElement( column ).setAttribute( "width", columnWidth + "px" );
        resizeMode = ResizeMode.RESIZING;
      }
    }

    if ( resizeMode != ResizeMode.RESIZING && resizeMode != ResizeMode.ENDING && eventClick )
    {
      super.onBrowserEvent( event );
    }
    else if ( resizeMode == ResizeMode.ENDING )
    {
      resizeMode = ResizeMode.NO;
    }
  }

  /**
   * @return
   */
  private TableRowElement getTableHeadElement()
  {
    TableRowElement row = getRowFormatter().getElement( 0 ).cast();
    return row;
  }

  /**
   * Diese Methode ist 1 zu 1 aus der Oberklasse übernommen. Nicht ändern!!!
   */
  private TableCellElement findNearestParentCell( Element elem )
  {
    while ( (elem != null) && (elem != getElement()) )
    {
      String tagName = elem.getTagName();
      if ( "td".equalsIgnoreCase( tagName ) || "th".equalsIgnoreCase( tagName ) )
      {
        return elem.cast();
      }
      elem = elem.getParentElement();
    }
    return null;
  }
}

これはあまり良くありませんが、私にとってはうまくいきます。

于 2015-03-10T14:45:41.797 に答える