Это неопределенное поведение (UB), означающее, что может произойти все что угодно, включая работающий код. Это UB, потому что emplace_back
делает недействительными все указатели на объекты в векторе. Это происходит потому, что вектор может быть перераспределен (что, очевидно, так и есть).
Первый случай UB «не работает» из-за оптимизации короткой строки (sso). Из-за sso необработанный указатель указывает на память, непосредственно выделенную вектором, которая теряется после перераспределения.
Второй случай UB «работает», потому что текст строки слишком длинный для SSO и находится в независимом блоке памяти. Во время изменения размера строковый объект перемещается из, перемещая владельца блока памяти текста во вновь созданный строковый объект. Поскольку блок памяти просто меняет владельца, он остается в силе после emplace_back
.
The TableModel only concerns itself with the data, the ListSelectionModel concerns itself with what is currently selected, so, no you can't get the selected row from the TableModel.
Как сказал MrWiggles, вы можете получить его из ListSelectionModel, доступ к которому вам доступен из самой таблицы. Однако в JTable есть удобные методы для получения выбранных строк. Если ваша таблица поддерживает сортировку и т. Д., Вам также нужно будет использовать метод convertRowIndexToModel :)
Из JTable JavaDoc:
int[] selection = table.getSelectedRows();
for (int i = 0; i < selection.length; i++) {
selection[i] = table.convertRowIndexToModel(selection[i]);
}
// selection is now in terms of the underlying TableModel
Если вы позволите своему классу модели реализовать ListSelectionModel, а также TableModel, вы сможете получить выбор из одной модели ... но вы не сможете расширить два класса абстрактных моделей :-( (Это также в любом случае не очень хорошая идея, так как у вашего класса будет слишком много обязанностей).