Как добавить панель управления в строку JTable при наведении курсора мыши (наведении курсора)

#java #swing #jtable

Вопрос:

У меня есть не редактируемая таблица, в которой я хотел бы отобразить контекстную панель строк (скорее всего, a JPanel ). Что-то вроде того, что делает Gmail: при наведении курсора мыши на строки почты в этой конкретной строке отображается простая панель инструментов.

Gmail

Как и в gmail, действие элементов управления, которые я хотел бы отобразить, не будет изменять значения, вместо этого они будут использовать значение в строке для выполнения некоторой работы с предложениями.

Я играл со следующими :

  • TableCellRenderer , дисплей в основном работает, но у него есть ограничения:
    • компонент используется только для рендеринга, поэтому его нельзя использовать для простого добавления нескольких кнопок
    • для этого требуется еще одна колонка
    • для поведения при наведении курсора (т. Е. отображения на строке только при наведении мыши на строку) требуется сотрудничество с таблицей MouseListener
  • TableCellEditor , моя таблица недоступна для редактирования, поэтому редактор ячеек не вызывается
    • для этого также требуется определенная колонка
    • это также требует сотрудничества с таблицей MouseListener
  • MouseMotionListener может использоваться для отображения всплывающего окна для определенных координат
    • всплывающее окно кажется подходящим компонентом для этого
    • существует довольно много кода для обработки жизненного цикла всплывающего окна (закрывая его, когда мышь выходит из строки, не открывайте всплывающее окно повторно, если оно уже открыто).
  • подсказки: насколько мне известно, всплывающие подсказки swing не позволяют использовать компоненты управления, такие как кнопки и т. Д

Я задал соответствующий вопрос и ответил на переполнение стека. Но все они требуют добавления столбца для отображения и использования этих компонентов swing.

Комментарии:

1. не открывайте всплывающее окно повторно, если оно уже открыто , я бы использовал a JPopupMenu . Вы бы отслеживали текущую строку. Когда он изменится, вы скроете всплывающее окно и отобразите его повторно.

2. @camickr Спасибо за предложение. Это привело меня к JLayeredPane тому , что у меня все еще есть проблемы с фокусировкой, отображением и компоновкой при таком подходе.

Ответ №1:

Учитывая, что вы не опубликовали никакого кода, этот вопрос немного широк.

Тем не менее, способ сделать это-вставить JPanel в JPopupMenu. Вам нужно создать прослушиватель в своем графическом интерфейсе, чтобы знать, когда и где должно появиться меню jpopup

— Редактировать —

Я думаю, что вам нужно добавить JMenus в JPopupMenu, и то, что я предложил о добавлении JPanel, не будет работать чисто. Вы можете либо использовать JPopupMenu, либо использовать JWindow и поместить в него свою JPanel.

Комментарии:

1. Привет @ControlAltDel, да, я не думаю, что код необходим, так как я пытаюсь найти наилучший подход к решению этой проблемы UX. Я начал работать с a JLayeredPane вместо создания JWindow / JPopupMenu, в то время как я борюсь с некоторыми проблемами компоновки / рисования на данный момент, я считаю, что подход лучше.