フレックステーブルの列をサイズ変更可能にしようとしています。したがって、ユーザーは列の幅を決定できます。1 つの解決策は、css の resize プロパティを使用することですが、これは IE では機能しません。IEでこれを機能させる方法を知っている人はいますか?
私の考えは、 onBrowserEvent をキャッチしていくつかのマウスハンドラーを登録することでしたが、サイズを変更する適切な要素が得られません。
あなたが私を助けてくれることを願っています。前もって感謝します!
こんにちは、私は自分自身の解決策を見つけました。多分これは誰かを助けることができます。
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;
}
}
これはあまり良くありませんが、私にとってはうまくいきます。