void (@NlsSafe String initialText) { myResultList = new Tree(); myResultList.setExpandableItemsEnabled(false); myResultList.getEmptyText().setText(CommonBundle.getLoadingTreeNodeText()); myResultList.setRootVisible(false); myResultList.setShowsRootHandles(true); myResultList.setModel(null); MyArtifactCellRenderer renderer = myClassMode ? new MyClassCellRenderer(myResultList) : new MyArtifactCellRenderer(myResultList); myResultList.setCellRenderer(renderer); myResultList.setRowHeight(renderer.getPreferredSize().height); mySearchField = new JTextField(initialText); mySearchField.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int d; if (e.getKeyCode() == KeyEvent.VK_DOWN) { d = 1; } else if (e.getKeyCode() == KeyEvent.VK_UP) { d = -1; } else { return; } int row = myResultList.getSelectionModel().getLeadSelectionRow(); row += d; if (row >=0 && row < myResultList.getRowCount()) { myResultList.setSelectionRow(row); } } }); setLayout(new BorderLayout()); add(mySearchField, BorderLayout.NORTH); JScrollPane pane = ScrollPaneFactory.createScrollPane(myResultList); pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); // Don't remove this line. // Without VERTICAL_SCROLLBAR_ALWAYS policy our custom layout // works incorrectly, see https://youtrack.jetbrains.com/issue/IDEA-72986 add(pane, BorderLayout.CENTER); mySearchField.getDocument().addDocumentListener(new DocumentAdapter() { @Override protected void textChanged(@NotNull DocumentEvent e) { scheduleSearch(); } }); myResultList.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { if (!myAlarm.isEmpty()) return; boolean hasSelection = !myResultList.isSelectionEmpty(); myListener.canSelectStateChanged(MavenArtifactSearchPanel.this, hasSelection); } }); myResultList.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER && myResultList.getLastSelectedPathComponent() != null) { myListener.itemSelected(); e.consume(); } } }); new DoubleClickListener() { @Override protected boolean onDoubleClick(@NotNull MouseEvent e) { final TreePath path = myResultList.getPathForLocation(e.getX(), e.getY()); if (path != null && myResultList.isPathSelected(path)) { Object sel = path.getLastPathComponent(); if (sel != null && myResultList.getModel().isLeaf(sel)) { myListener.itemSelected(); return true; } } return false; } }.installOn(myResultList); }