#java #swing #jtable
Вопрос:
У меня есть не редактируемая таблица, в которой я хотел бы отобразить контекстную панель строк (скорее всего, a JPanel
). Что-то вроде того, что делает 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, в то время как я борюсь с некоторыми проблемами компоновки / рисования на данный момент, я считаю, что подход лучше.