Выбор строки JTable по щелчку правой кнопкой мыши [дубликат]

В зависимости от вашей конкретной цели существует способ достижения полезности родительского селектора без использования одного (даже если бы он существовал) ...

Скажем, у нас есть:

<div>
  <ul>
    <li><a>Pants</a></li>
    <li><a>Socks</a></li>
    <ul>
      <li><a>White socks</a></li>
      <li><a>Blue socks</a></li>
    </ul>
  </ul>
</div>

Что мы можем сделать, чтобы блок Socks (включая цвета носка) выделялся визуально с использованием интервала?

Что было бы неплохо, но не существует:

ul li ul:parent {
  margin-top: 15px;
  margin-bottom: 15px;
}

Что существует:

li > a {
  margin-top: 15px;
  display: block;
}
li > a:only-child {
  margin-top: 0px;
}

Это устанавливает, что все привязные ссылки имеют верхний край 15px и сбрасывают его обратно на 0 для тех, у которых нет элементов UL (или других тегов) внутри LI.

28
задан Carlo del Mundo 24 August 2010 в 16:47
поделиться

2 ответа

:

table.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseReleased(MouseEvent e) {
        int r = table.rowAtPoint(e.getPoint());
        if (r >= 0 && r < table.getRowCount()) {
            table.setRowSelectionInterval(r, r);
        } else {
            table.clearSelection();
        }

        int rowindex = table.getSelectedRow();
        if (rowindex < 0)
            return;
        if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {
            JPopupMenu popup = createYourPopUp();
            popup.show(e.getComponent(), e.getX(), e.getY());
        }
    }
});

......

81
ответ дан maysi 17 August 2018 в 23:57
поделиться
  • 1
    Точно так же:] ... верхняя половина mouseReleased () - это то, что мне нужно. Будет принято решение + принято в качестве ответа. Спасибо, ты мужчина (или женщина)! – Carlo del Mundo 24 August 2010 в 17:01
  • 2
    Отличный ответ. Подробно: на некоторых платформах (Mac OS X, чтобы назвать его) всплывающее меню запускается с помощью mousePressed, а не mouseReleased, поэтому, если вы используете этот код, всплывающее окно не появится, если вы запустите приложение в Mac OS ИКС. – gabuzo 31 December 2012 в 11:31
  • 3
    – Ad Infinitum 11 October 2016 в 10:35

В принятом ответе не принимаются ключи-модификаторы, такие как ctrl или shift, но они указывают, что текущий выбор должен быть заменен не , но расширен.

Кроме того, я добавлена ​​поддержка нескольких ОС, проверив mousePressed и mouseReleased.

Следуя, вы можете найти полный пример того, как отрегулировать выбранные строки, используя ListSelectionModel , в том числе MouseEvent#getModifiers . После этого можно открыть (необязательно) JPopupMenu .

JPopupMenu contextMenu = new JPopupMenu();
// ...
// add elements to the popup menu
// ...

table.addMouseListener(new MouseAdapter() {
  @Override
  public void mousePressed(MouseEvent e) {
    handleRowClick(e);
    if (e.isPopupTrigger()) {
      doPop(e);
    } else {
      hidePop();
    }
  }

  @Override
  public void mouseReleased(MouseEvent e) {
    if (e.isPopupTrigger()) {
      doPop(e);
    }
  }

  private void handleRowClick(MouseEvent e) {
    ListSelectionModel selectionModel = table.getSelectionModel();
    Point contextMenuOpenedAt = e.getPoint();
    int clickedRow = table.rowAtPoint(contextMenuOpenedAt);

    if (clickedRow < 0) {
      // No row selected
      selectionModel.clearSelection();
    } else {
      // Some row selected
      if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) {
        int maxSelect = selectionModel.getMaxSelectionIndex();

        if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
          // Shift + CTRL
          selectionModel.addSelectionInterval(maxSelect, clickedRow);
        } else {
          // Shift
          selectionModel.setSelectionInterval(maxSelect, clickedRow);
        }
      } else if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
        // CTRL
        selectionModel.addSelectionInterval(clickedRow, clickedRow);
      } else {
        // No modifier key pressed
        selectionModel.setSelectionInterval(clickedRow, clickedRow);
      }
    }
  }

  private void doPop(MouseEvent e) {
    if (table.getSelectedRowCount() == 0) {
      return;
    }
    contextMenu.setVisible(true);
    contextMenu.show(e.getComponent(), e.getX(), e.getY());
  }

  private void hidePop() {
    contextMenu.setVisible(false);
  }
});
1
ответ дан Markus Weninger 17 August 2018 в 23:57
поделиться
  • 1
    Нет необходимости в ручной обработке ввода, JTable уже относится к клавишам SHIFT и CTRL и так далее. Единственное изменение, которое необходимо в исходном решении, - это не использовать setRowSelectionInterval () в случае, если выбранная сфокусированная строка уже выбрана, например: if (! Table.getSelectionModel (). IsSelectedIndex (r)) table.setRowSelectionInterval (r, r); – Oliver Hoffmann 26 August 2016 в 12:26
Другие вопросы по тегам:

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