2013-06-27 6 views
0

У меня есть некоторые проблемы при попытке получить первое значение столбца выбранной строки в виде таблицы. Я заселить мои данные таблицы динамически:Выбор строки из таблицы

private TableView<Category> viewCategory = new TableView<>(); 

public List<Category> populateCategoryTable() { 
    List ll = new LinkedList(); 

    try { 
     db.getConnection(); 
     String sql = "SELECT * FROM sm_category"; 
     ResultSet rs = null; 
     // Call readRequest to get the result 
     rs = db.readRequest(sql); 

     while (rs.next()) { 
      String ID = rs.getString("categoryID"); 
      String name = rs.getString("categoryName"); 
      String desc = rs.getString("categoryDescription"); 
      Category row = new Category(); 
      row.setid(ID); 
      row.setname(name); 
      row.setdesc(desc); 
      ll.add(row); 
     } 
     rs.close(); 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
     System.out.println("Error SQL!!!"); 
     System.exit(0); 
    } 
    return ll; 
} 

public class Category { 

private SimpleStringProperty ID; 
private SimpleStringProperty name; 
private SimpleStringProperty desc; 

public void setid(String value) { 
    IDProperty().set(value); 
} 

public String getid() { 
    return IDProperty().get(); 
} 

public SimpleStringProperty IDProperty() { 
    if (ID == null) { 
     ID = new SimpleStringProperty(this, "ID"); 
    } 
    return ID; 
} 

public void setname(String value) { 
    nameProperty().set(value); 
} 

public String getname() { 
    return nameProperty().get(); 
} 

public SimpleStringProperty nameProperty() { 
    if (name == null) { 
     name = new SimpleStringProperty(this, "name"); 
    } 
    return name; 
} 

public void setdesc(String value) { 
    descProperty().set(value); 
} 

public String getdesc() { 
    return descProperty().get(); 
} 

public SimpleStringProperty descProperty() { 
    if (desc == null) { 
     desc = new SimpleStringProperty(this, "desc"); 
    } 
    return desc; 
} 
} 

И когда выбрана строка, я выполняю это на мой взгляд таблицы:

viewCategory.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { 
     // this method will be called whenever user selected row 
     @override 
     TableView.TableViewSelectionModel selectionModel = viewCategory.getSelectionModel(); 
     ObservableList selectedCells = selectionModel.getSelectedCells(); 
     TablePosition tablePosition = (TablePosition) selectedCells.get(0); 
     int row = tablePosition.getRow(); // yields the row that the currently selected cell is in 
    } 
); 

Однако, я получил сообщение об ошибке:

<anonymous shopManagement.boundary.RetrieveProductUI$1> is not abstract and does not override abstract method changed(ObservableValue,Object,Object) in ChangeListener 

и я понятия не имею, почему. Кто-нибудь может помочь?

Обновлено Порция

viewCategory.getSelectionModel().setCellSelectionEnabled(true); 
    viewCategory.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); // just in case you didnt already set the selection model to multiple selection. 
    viewCategory.getSelectionModel().getSelectedCells().addListener(new ListChangeListener<TablePosition>() { 
     @Override 
     public void onChanged(Change<? extends TablePosition> change) { 
      TableView.TableViewSelectionModel selectionModel = viewCategory.getSelectionModel(); 
      ObservableList selectedCells = selectionModel.getSelectedCells(); 
      TablePosition tablePosition = (TablePosition) selectedCells.get(0); 
      int row = tablePosition.getRow(); // yields the row that the currently selected cell is in 
      System.out.println(row); 
     } 
    }); 

мне удалось отобразить данные, но я просто не могу получить выбранную строку. Это дает мне сообщение об ошибке, которое:

IndexOutOfBoundsException: Индекс: 0 Размер: 0

ответ

1

Попробуйте сделать что-то вроде этого:

t.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observableValue, String s, String s2) { 
       DefaultTableModel model = (DefaultTableModel) table.getModel(); 
       int pos = table.getSelectedRow(); 
       String value = (String) model.getValueAt(pos, 0); //current row, first column 
     } 
    }); 

Надеется, что это помогает.

+0

Вы имеете в виду помещение внутри слушателя изменений? –

+0

Я отредактирую свой ответ с полным кодом. EDIT: мой код внутри метода 'changed (...)' возвращает вам значение в первом столбце в выбранной строке. – Federico

+0

После добавления этих кодов возникает целая куча ошибок. не подходящий метод нашел для AddListener (<анонимного ChangeListener >) метод ObservableValue.addListener (ChangeListener ) не применяется (фактический аргумент <анонимный ChangeListener > не может быть преобразован в ChangeListener путем преобразования вызова метода) метод Observable.addListener (InvalidationListener) не применяется –

1

YourChangeListener не является полным. у вас есть аннотация @override, но вы не переоценили какой-либо метод. Ваш changeListener должен быть таким, что

t.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observableValue, String s, String s2) { 

     } 
    });