我想在我的表创建一个从数据的ArrayList。 我需要从可见列获取值,但我也需要从没有在表格中列得值。 使用SWT以表查看,我怎么就不能在我的表显示的列上没有任何想法。 我也对如何通过指定列名拉从表中的数据不知道。
我一直使用的秋千,所以我一直用一个表模型类。 在摆它是非常简单的创建列,隐藏它们并从中获取数据。
这是我如何在以前的秋千项目做到了。
在我的表模型类 :
public String getColumnName(int column) {
String s = null;
switch (column) {
case ITEMID_COL: {
s = "ItemId";
break;
}
然后, getValueAt()
public Object getValueAt(int row, int column) {
Object o = null;
try {
switch (column) {
case ITEMID_COL: {
o = rds.get(row).rev.getItem().getStringProperty("item_id");
break;
}
所以,当我需要从我的表中的数据在任何其他类,都是我所要做的就是
Object item_id = SingletonSelectTable.getInstance().getValueAt(i, SingletonSelectTable.getInstance().ITEMID_COL);
我也可以很容易地通过设置隐藏列MAX_COLUMNS
。
问题 :
我需要学习如何将列添加到那些不会被显示,但仍然含有使用表查看值的表。
我需要学习如何从表中访问值,这样我就可以创建一个从列可见和不可见数据的阵列。
这甚至可能使用表查看?
好的:
要隐藏TableColumn
,你可以将其宽度基本设置为0
,并阻止调整大小。 由宽度设置的东西显示它>= 0
和使调整大小。
由于您使用的是TableViewer
有ModelProvider,当你要访问的内容并不重要的列是隐藏的。 刚刚获得从模型对象,并从中获取您的信息。
这里是一个可以隐藏/取消隐藏列,仍然打印当前选择的人的例子:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, false));
final TableViewer viewer = new TableViewer(shell, SWT.READ_ONLY);
// First column is for the name
TableViewerColumn col = createTableViewerColumn("Name", 100, 0, viewer);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if(element instanceof Person)
{
System.out.println("1");
return ((Person)element).getName();
}
return "";
}
});
// First column is for the location
TableViewerColumn col2 = createTableViewerColumn("Location", 100, 1, viewer);
col2.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if(element instanceof Person)
{
System.out.println("2");
return ((Person)element).getLocation();
}
return "";
}
});
final Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.horizontalSpan = 2;
table.setLayoutData(data);
/* This button will hide/unhide the columns */
Button button1 = new Button(shell, SWT.PUSH);
button1.setText("Hide / Unhide");
button1.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event arg0) {
for(final TableColumn column : table.getColumns())
{
if(column.getWidth() == 0)
{
column.setWidth(100);
column.setResizable(true);
}
else
{
column.setWidth(0);
column.setResizable(false);
}
}
}
});
/* This button will print the currently selected Person, even if columns are hidden */
Button button2 = new Button(shell, SWT.PUSH);
button2.setText("Print");
button2.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event arg0) {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
Person person = (Person) selection.getFirstElement();
System.out.println(person);
}
});
viewer.setContentProvider(ArrayContentProvider.getInstance());
final Person[] persons = new Person[] { new Person("Baz", "Loc"),
new Person("BazBaz", "LocLoc"), new Person("BazBazBaz", "LocLocLoc") };
viewer.setInput(persons);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private static TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber, TableViewer viewer) {
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(title);
column.setWidth(bound);
column.setResizable(true);
column.setMoveable(false);
return viewerColumn;
}
public static class Person {
private String name;
private String location;
public Person(String name, String location) {
this.name = name;
this.location = location;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String toString()
{
return name + " " + location;
}
}
唯一要注意的就是列的宽度设置为0
不会调用的防止getText()
该列的标签供应商的方法。 如果必须避免这种调用(它的消耗,例如时间),解决的办法是dispose()
树列。 (要再次显示列,则必须重新创建。)