如何检测 Java SWT Table 的垂直 ScrollBar 何时变得可见?我需要这些信息来重新计算列的宽度。似乎在 ScrollBars 上没有触发任何事件(除了选择)。
问问题
5278 次
3 回答
3
我想你已经正确地发现没有简单的检测方法when the vertical ScrollBar is visible
。无论如何,这里提供的解决方案是一种 hack。
我正在使用这个 SWT 片段中提出的概念来计算表中的可见行。除此之外,我也在使用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 行
注意 -如果您要使用绘制事件,请尝试将计算保持在最低限度,因为它经常被调用。
希望这会有所帮助。
于 2011-04-18T05:51:05.123 回答
2
这对我有用:
boolean isScrollVisible = table.getVerticalBar().getVisible();
Point vBarSize = table.getVerticalBar().getSize();
int width_diff =
current_width.x - totalColumnWidth - (isScrollVisible ? vBarSize.x : 0 );
于 2014-10-05T18:01:58.617 回答
0
我发现,根据调整大小通知,您可以获取 Scrollable 的边界和客户区域之间的差异。任一维度的差异应该表明存在滚动条。
于 2012-12-20T14:23:44.807 回答