【发布时间】:2011-04-15 08:31:50
【问题描述】:
如何检测 Java SWT Table 的垂直 ScrollBar 何时可见?我需要这些信息来重新计算列的宽度。似乎在 ScrollBars 上没有触发任何事件(除了选择)。
【问题讨论】:
如何检测 Java SWT Table 的垂直 ScrollBar 何时可见?我需要这些信息来重新计算列的宽度。似乎在 ScrollBars 上没有触发任何事件(除了选择)。
【问题讨论】:
我想你已经正确地发现没有简单的方法来检测when the vertical ScrollBar is visible。无论如何,这里提供的解决方案是一种 hack。
我正在使用此 SWT sn-p compute the visible rows in a table 中提出的概念。除此之外,我还使用SWT Paint Event。
基本概念如下:
SWT Paint Event
>> 代码
import org.eclipse.swt.*;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class TableScrollVisibilityTest
{
private static int count;
public static void main(String [] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setBounds(10,10,300,300);
shell.setLayout(new GridLayout(2,true));
final Table table = new Table(shell, SWT.NONE);
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 2;
table.setLayoutData(data);
count = 0;
final Button addItem = new Button (shell, SWT.PUSH);
addItem.setText ("Add Row");
data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 2;
addItem.setLayoutData(data);
final Text text = new Text(shell, SWT.BORDER);
text.setText ("Vertical Scroll Visible - ");
data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 2;
text.setLayoutData(data);
addItem.addListener (SWT.Selection, new Listener ()
{
public void handleEvent (Event e)
{
new TableItem(table, SWT.NONE).setText("item " + count);
count++;
}
});
table.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Rectangle rect = table.getClientArea ();
int itemHeight = table.getItemHeight ();
int headerHeight = table.getHeaderHeight ();
int visibleCount = (rect.height - headerHeight + itemHeight - 1) / itemHeight;
text.setText ("Vertical Scroll Visible - [" + (table.getItemCount()>= visibleCount)+"]");
// YOUR CODE HERE
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
>> 输出
对于 itemcount
对于 itemcount >= numberofvisible rows
注意-如果您要使用绘画事件,请尽量将计算量保持在最低限度,因为它经常被调用。
希望这会有所帮助。
【讨论】:
这对我有用:
boolean isScrollVisible = table.getVerticalBar().getVisible();
Point vBarSize = table.getVerticalBar().getSize();
int width_diff =
current_width.x - totalColumnWidth - (isScrollVisible ? vBarSize.x : 0 );
【讨论】:
我发现,在调整大小通知时,您可以获取 Scrollable 的边界和客户区域之间的差异。任一维度的差异应该表明存在滚动条。
【讨论】: