如何定义 Table 的垂直对齐方式
How To Define Table's Vertical Alignment
难以置信的简单问题:我有一个 SWT table(查看器)并使用 SWT.MeasureItem
侦听器来设置单元格高度。如何将单元格内容对齐到单元格底部?
(它可能会与另一个听众一起工作 SWT.PaintItem
和一些数学并手动渲染我的所有单元格,但这不是正确的方法。)
public class TableDialog extends Dialog {
public static void main(String[] args) {
TableDialog dialog = new TableDialog(new Shell());
dialog.open();
}
public TableDialog(Shell parent) {
super(parent);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("Table Test");
newShell.setSize(500, 300);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new FillLayout());
TableViewer viewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setInput(Arrays.asList("A", "B", " C"));
Table table = viewer.getTable();
table.setLinesVisible(true);
table.addListener(SWT.MeasureItem, e -> e.height = 90);
return container;
}
}
恐怕,SWT.PaintItem
在这种情况下是正确的方法。
其中一个 SWT 片段演示了如何在 table 项目中绘制多条线。它可以作为您自定义绘图代码的起点:
Custom Drawing Table and Tree Items 文章提供了更多信息。
一旦开始使用SWT.MeasureItem
,您还需要进行绘图。
由于您使用的是 TableViewer
,因此您可以通过使用 OwnerDrawLabelProvider
作为查看器标签提供程序将所有这些合并为一个 class。一个非常简单的版本是这样的:
viewer.setLabelProvider(new OwnerDrawLabelProvider()
{
@Override
protected void paint(final Event event, final Object element)
{
String text = element.toString();
GC gc = event.gc;
int textHeight = gc.textExtent(text).y;
int yPos = event.y + event.height - textHeight;
gc.drawText(text, event.x, yPos);
}
@Override
protected void measure(final Event event, final Object element)
{
event.height = 90;
}
@Override
protected void erase(final Event event, final Object element)
{
// Stop the default draw of the foreground
event.detail &= ~SWT.FOREGROUND;
}
});
难以置信的简单问题:我有一个 SWT table(查看器)并使用 SWT.MeasureItem
侦听器来设置单元格高度。如何将单元格内容对齐到单元格底部?
(它可能会与另一个听众一起工作 SWT.PaintItem
和一些数学并手动渲染我的所有单元格,但这不是正确的方法。)
public class TableDialog extends Dialog {
public static void main(String[] args) {
TableDialog dialog = new TableDialog(new Shell());
dialog.open();
}
public TableDialog(Shell parent) {
super(parent);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("Table Test");
newShell.setSize(500, 300);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new FillLayout());
TableViewer viewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setInput(Arrays.asList("A", "B", " C"));
Table table = viewer.getTable();
table.setLinesVisible(true);
table.addListener(SWT.MeasureItem, e -> e.height = 90);
return container;
}
}
恐怕,SWT.PaintItem
在这种情况下是正确的方法。
其中一个 SWT 片段演示了如何在 table 项目中绘制多条线。它可以作为您自定义绘图代码的起点:
Custom Drawing Table and Tree Items 文章提供了更多信息。
一旦开始使用SWT.MeasureItem
,您还需要进行绘图。
由于您使用的是 TableViewer
,因此您可以通过使用 OwnerDrawLabelProvider
作为查看器标签提供程序将所有这些合并为一个 class。一个非常简单的版本是这样的:
viewer.setLabelProvider(new OwnerDrawLabelProvider()
{
@Override
protected void paint(final Event event, final Object element)
{
String text = element.toString();
GC gc = event.gc;
int textHeight = gc.textExtent(text).y;
int yPos = event.y + event.height - textHeight;
gc.drawText(text, event.x, yPos);
}
@Override
protected void measure(final Event event, final Object element)
{
event.height = 90;
}
@Override
protected void erase(final Event event, final Object element)
{
// Stop the default draw of the foreground
event.detail &= ~SWT.FOREGROUND;
}
});