Java SWT-表查看器-隐藏列并从列中获取值

Java SWT-表查看器-隐藏列并从列中获取值,java,swt,tableviewer,Java,Swt,Tableviewer,我正在尝试从表中的数据创建arraylist。我需要从可见列中获取值,但也需要从表中不可见的列中获取值。使用SWT和表查看器,我不知道如何不在表中显示列。我也不知道如何通过指定列名从表中提取数据 我一直使用Swing,所以我一直使用Table模型类。在swing中,创建列、隐藏列并从中获取数据非常简单 在以前的Swing项目中,我就是这样做的 在我的表格模型类中: public String getColumnName(int column) { String s = null; sw

我正在尝试从表中的数据创建arraylist。我需要从可见列中获取值,但也需要从表中不可见的列中获取值。使用SWT和表查看器,我不知道如何不在表中显示列。我也不知道如何通过指定列名从表中提取数据

我一直使用Swing,所以我一直使用Table模型类。在swing中,创建列、隐藏列并从中获取数据非常简单

在以前的Swing项目中,我就是这样做的

在我的表格模型类中

public String getColumnName(int column) {
  String s = null;

  switch (column) {
     case ITEMID_COL: {
        s = "ItemId";
        break;
     }
然后是
getValueAt()

所以,当我在任何其他类中需要表中的数据时,我所要做的就是

Object item_id = SingletonSelectTable.getInstance().getValueAt(i, SingletonSelectTable.getInstance().ITEMID_COL);
我还可以通过设置
MAX\u columns
轻松隐藏列

问题

public String getColumnName(int column) {
  String s = null;

  switch (column) {
     case ITEMID_COL: {
        s = "ItemId";
        break;
     }
  • 我需要学习如何使用表查看器将不显示但仍包含值的列添加到表中

  • 我需要学习如何从表中访问值,以便从列中创建可见和不可见数据的数组

  • 使用表查看器是否可以实现这一点

  • 好的:

    要隐藏
    TableColumn
    ,基本上可以将其宽度设置为
    0
    ,并防止调整大小。通过将宽度设置为
    =0
    并启用大小调整来取消隐藏它

    由于您使用的是模型提供者的
    TableViewer
    ,因此当您想要访问内容时,列是否隐藏并不重要。只需从模型中获取对象并从中获取信息

    下面是一个可以隐藏/取消隐藏列并仍然打印当前选定人员的示例:

    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()
    tree column。(若要再次显示列,必须再次创建该列。)