#java #swing #tooltip #jpanel
#java #swing #всплывающая подсказка #jpanel
Вопрос:
У меня есть, ListCellRenderer
который расширяется JPanel
. Теперь я пытаюсь переопределить его createToolTip()
. Но, похоже, что метод не переопределяется. В чем может быть причина?
Мой код:
public class MyRender extends JPanel implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value != null) {
removeAll();
// -- add data to JPanel.
setToolTipText("hi");
return this;
}
return null;
}
@Override
public JToolTip createToolTip() {
System.out.println("Success");
return new MyToolTip();
}
}
Он даже не выводит «Success».
Ответ №1:
Я предполагаю, что этот метод никогда не вызывается, потому что ListCellRenderer
действует как «резиновый штамп«, следовательно, он существует только во время перерисовки и никогда не добавляется ни в один контейнер, в частности не в тот, JList
которому он назначен.
Таким образом, всплывающая подсказка всегда создается JList
самой собой, никогда ListCellRenderer
.
Если вы хотите иметь специальную всплывающую подсказку для каждого элемента в вашем списке, то есть несколько способов, самый простой (но, возможно, не самый приятный), вероятно, это создать подкласс JList
и переопределить getToolTipText(MouseEvent e)
. Этот метод получил координаты мыши, для которых, чтобы получить всплывающую подсказку, вам придется преобразовать их в индекс элемента, над которым находится мышь, с помощью locationToIndex()
.
Комментарии:
1. как получить координату мыши в
getToolTipText()
?2. в
MouseEvent
переданном в качестве аргумента.3. Ладно, понял. На самом деле сначала я переопределил значение по умолчанию
getToolTipText()
, то есть без каких-либо аргументов.4. Извините за путаницу, я не обратил внимания на другой метод.