Rxjs оператора транслирует всю таблицу одновременно. Оператор отображения Rxjs отображает всю таблицу на новый вывод. Если вы хотите изменить элементы в таблице, вам также нужно использовать функцию js map для изменения всей таблицы, проверяя все элементы таблицы отдельно.
this.books.pipe(
map(
books => books.map( book => { ...book, IsEnable: this.getEligibleBooks(book) })),
).subscribe(data => console.log(data));
Хорошо, второе взятие (я оставил первое, поскольку это могло бы заинтересовать кого-то для некоторого другого использования, кто знает? Скажите, что это там для образовательной цели... :-)).
Я взглянул на исходный код JTable и узнал, что события от нажатия мыши обрабатываются стилем. Знание, как это обрабатывает клавишу CTRL, я мог безопасно переопределить changeSelection метод, чтобы сделать то, в чем Вы нуждаетесь.
Я нахожу требования немного странными (можно ли все еще использовать Shift+click, нет?), но я не знаю контекст.
class SpecialTable extends JTable
{
SpecialTable(Object[][] data, String[] columnNames)
{
super(data, columnNames);
// That's already the default
// setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}
/**
* Called by javax.swing.plaf.basic.BasicTableUI.Handler.adjustSelection(MouseEvent)
* like: table.changeSelection(pressedRow, pressedCol, e.isControlDown(), e.isShiftDown());
*/
@Override
public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend)
{
if (toggle && !isRowSelected(rowIndex))
return; // Don't do the selection
super.changeSelection(rowIndex, columnIndex, toggle, extend);
}
}
Намного более простой и точно в чем Вы нуждаетесь!
BTW, благодарит обеспечить такой простой хороший тестовый сценарий, я, возможно, не попробовал, если я должен был записать это сам... :-D Это была интересная и учащаяся проблема.
Я имел успех со следующим, хотя я не уверен, что это - лучший метод...
class SpecialTable extends JTable
{
boolean bIsControlDown;
int clickedRow;
SpecialTable(Object[][] data, String[] columnNames)
{
super(data, columnNames);
// setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
getSelectionModel().addListSelectionListener(this);
addMouseListener(new MouseInputAdapter()
{
public void mousePressed(MouseEvent me)
{
bIsControlDown = me.isControlDown();
clickedRow = rowAtPoint(me.getPoint());
}
});
}
public void valueChanged(ListSelectionEvent evt)
{
super.valueChanged(evt);
if (bIsControlDown)
{
if (!evt.getValueIsAdjusting())
{
// System.out.println(evt);
// System.out.println("=> " + clickedRow);
getSelectionModel().removeSelectionInterval(clickedRow, clickedRow);
}
}
}
}
Замените определение строк table
в Вашем коде с только:
JTable table = new SpecialTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 100));
Когда Вы щелчок управления отмененная выбор строка, это кратко выбрано, затем отменило выбор.