Измените Ctrl + поведение щелчка на JTable

Rxjs оператора транслирует всю таблицу одновременно. Оператор отображения Rxjs отображает всю таблицу на новый вывод. Если вы хотите изменить элементы в таблице, вам также нужно использовать функцию js map для изменения всей таблицы, проверяя все элементы таблицы отдельно.

this.books.pipe(
      map(
        books => books.map( book => { ...book, IsEnable: this.getEligibleBooks(book) })),
    ).subscribe(data => console.log(data));
5
задан Michael Myers 12 March 2009 в 16:44
поделиться

2 ответа

Хорошо, второе взятие (я оставил первое, поскольку это могло бы заинтересовать кого-то для некоторого другого использования, кто знает? Скажите, что это там для образовательной цели... :-)).

Я взглянул на исходный код 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 Это была интересная и учащаяся проблема.

8
ответ дан 14 December 2019 в 01:18
поделиться

Я имел успех со следующим, хотя я не уверен, что это - лучший метод...

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));

Когда Вы щелчок управления отмененная выбор строка, это кратко выбрано, затем отменило выбор.

1
ответ дан 14 December 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: