JTable:如何从绑定到数据源的表中获取所选对象

时间:2011-09-05 13:32:02

标签: java swing user-interface jtable beans-binding

我有JTable将“elements”属性绑定到对象List,这是master表。还有详细信息表,其中“elements”属性绑定到master表中的selectedElement。我是在NetBeans GUI builder的帮助下完成的。现在我尝试得到这样的东西:

SomeEntityType selectedObject= (SomeEntityType) masterTable.getSelectedElement ()

在源代码中,但JTable中没有这样的属性,只有“getSelectedRow”。那么,我如何从JTable绑定到源(对象列表)中选择对象? 我已经阅读了类似的问题,但只找到getValueAt(rowId,columnId)方法的链接,但在我的任务中,选择哪一列并不重要,因为选择了完整行。

1 个答案:

答案 0 :(得分:3)

不知道Netbeans,只知道它使用了Beansbinding的一个版本,所以以下肯定能以某种方式应用

使用绑定框架的整个想法是,你从不直接与视图对话,而是完全专注于你的模型(或bean):这种模型的某些属性绑定到属性视图和您的代码只监听bean属性的更改。 “SelectedElement”是绑定的一个人工属性(实际上,JTableAdapterProvider,但你不需要知道:-),所以将你的模型属性绑定到那里 - 这是手动执行此操作的片段:

    // model/bean 
    public class AlbumManagerModel .. {
         // properties
         ObservableList<Album> albums;
         Album selectedAlbum;

         // vents the list of elements
         ObservableList<Album> getManagedAlbums() {
              return albums;
         }

         // getter/setter
         public Album getSelectedAlbum() {
              return selectedAlbum; 
         }

         public void setSelectedAlbum(Album album) {
            Album old = getSelectedAlbum();
            this.selectedAlbum = album;
            firePropertyChange("selectedAlbum", old, getSelectedAlbum());
         }


    }

    // bind the manager to a JTable

    BindingGroup context = new BindingGroup();
    // bind list selected element and elements to albumManagerModel
    JTableBinding tableBinding = SwingBindings.createJTableBinding(
            UpdateStrategy.READ,
            albumManagerModel.getManagedAlbums(), albumTable);
    context.addBinding(tableBinding);
    // bind selection 
    context.addBinding(Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
            albumManagerModel, BeanProperty.create("selectedAlbum"), 
            albumTable, BeanProperty.create("selectedElement_IGNORE_ADJUSTING")
    ));
    // bind columns 
    tableBinding.addColumnBinding(BeanProperty.create("artist"));
    ...
    context.bind();