Как отклонить все подсказки в таблице, когда начинается редактирование ячейки? - PullRequest
4 голосов
/ 19 января 2012

Я включил всплывающие подсказки в моем JTable, переопределив метод JComponent, который наследует JTable:

public String getToolTipText(MouseEvent e) { ... }

Теперь, предположим, что пользователь наводит курсор на ячейку, появляется всплывающая подсказка, а затем он начинает редактировать ячейку, я хочу принудительно отклонить подсказку.

В настоящее время всплывающая подсказка просто зависает, пока не истечет значение, указанное мной с помощью ToolTipManager # setDismissDelay. Иногда всплывающая подсказка может скрывать вид редактируемой ячейки, поэтому я хочу отклонить ее в тот момент, когда любая ячейка таблицы переходит в режим редактирования.

Я попробовал следующий подход (это псевдокод)

public String getToolTipText(MouseEvent e)
{
    if(table-is-editing)
        return null;
    else
        return a-string-to-display-in-the-tooltip;
}

Конечно, это имело эффект НЕ только показа подсказок таблицы УЖЕ в режиме редактирования. Я знал, что это не сработает, но это был скорее выстрел в темноте.

Ответы [ 5 ]

6 голосов
/ 19 января 2012

Вы можете показать / скрыть всплывающую подсказку с помощью кода, подобного:

//Action toolTipAction = component.getActionMap().get("postTip");
Action toolTipAction = component.getActionMap().get("hideTip");

if (toolTipAction != null)
{
    ActionEvent ae = new ActionEvent(component, ActionEvent.ACTION_PERFORMED, "");
    toolTipAction.actionPerformed( ae );
}

Вы, вероятно, можете переопределить метод prepareCellEditor(...) в JTable, чтобы добавить этот код, и он должен скрыть любую подсказку перед отображением редактора.

Edit:

В ответ на комментарий Клеопатры я добавляю следующее, чтобы убедиться, что действие добавлено в ActionMap:

table.getInputMap().put(KeyStroke.getKeyStroke("pressed F2"), "dummy");
ToolTipManager.sharedInstance().registerComponent( table );
6 голосов
/ 19 января 2012

Собирался комментировать «что-то не так с вашим» - но вспомнил случай использования, когда может не произойти скрытие всплывающей подсказки при начальных изменениях: -)

Некоторые факты:

  • всплывающие подсказки скрыты в mouseExit и в focusLost компонент, зарегистрированный в ToolTipManager
  • при запуске редактирования, когда компонент редактирования получает фокус, поэтому подсказка автоматически скрывается
  • по умолчанию, JTable не дает фокус компоненту редактирования, если редактирование начинается с ввода в ячейку (в отличие от двойного щелчка или F2): в этом случае не выполняется focusLost следовательно, всплывающая подсказка не скрыта
  • ToolTipManager действительно устанавливает hideAction, который может быть использован повторно (как упоминалось в @camickr). Но - это действие устанавливается, только если компонент имеет входную карту типа WHEN_FOCUSED. Что не относится к JTable (все его привязки в WHEN_ANCESTOR)

Так что для реализации требуемого поведения требуется несколько настроек, ниже приведен фрагмент кода (примечание для себя: реализовать в SwingX: -)

JTable table = new JTable(new AncientSwingTeam()) {

    {
        // force the TooltipManager to install the hide action
        getInputMap().put(KeyStroke.getKeyStroke("ctrl A"), 
             "just some dummy binding in the focused InputMap");
        ToolTipManager.sharedInstance().registerComponent(this);

    }

    @Override
    public boolean editCellAt(int row, int column, EventObject e) {
        boolean editing = super.editCellAt(row, column, e);
        if (editing && hasFocus()) {
            hideToolTip();
        }
        return editing;
    }

    private void hideToolTip() {
        Action action = getActionMap().get("hideTip");
        if (action != null) {
            action.actionPerformed(new ActionEvent(
                this, ActionEvent.ACTION_PERFORMED, "myName"));
        }
    }

};
1 голос
/ 17 октября 2014

Это сработало для меня и кажется более простым, чем использование действия:

ToolTipManager.sharedInstance().mouseExited(new MouseEvent(myJframe, 0, 0, 0, 0, 0, 0, 0, 0, false, 0));

Это, кажется, скрывает любую подсказку, показанную внутри указанного JFrame.

1 голос
/ 19 января 2012

Ознакомьтесь с этим JTable учебником . В частности это вебстарт . Есть две редактируемые колонки с подсказками - «Спорт» и «Вегетарианец» работают отлично. Используете ли вы какие-либо пользовательские средства визуализации клеток?

0 голосов
/ 24 августа 2012

В JDK 1.6, когда отображается всплывающая подсказка для ячейки, пользователь не может расширить диапазон выбранных строк с помощью клавиатуры. Решение, представленное выше, сработало очень хорошо и для этой проблемы. Вот код:

public class ToolTipTable extends JTable
{
/**
 * Constructor
 */
public ToolTipTable()
{
    super();

    // force the TooltipManager to install the hide action
    getInputMap().put(KeyStroke.getKeyStroke("ctrl A"),
            "just some dummy binding in the focused InputMap");
    ToolTipManager.sharedInstance().registerComponent(this);

    //hide the tool tip when row selection changes
    this.getSelectionModel().addListSelectionListener(
            new ListSelectionListener()
            {
                @Override
                public void valueChanged(ListSelectionEvent e)
                {
                    hideToolTip();
                }
            });
}

/**
 * Make the cell tool tip show the contents of the cell. (Useful if the
 * cell contents are wider than the column.)
 */
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row,
        int column)
{
    Component c = super.prepareRenderer(renderer, row, column);
    if (c instanceof JComponent)
    {
        JComponent jc = (JComponent) c;
        Object valueObj = getValueAt(row, column);
        if (valueObj != null)
        {
             jc.setToolTipText(getValueAt(row, column).toString());
        }
    }
    return c;
}

/**
 * 
 */
private void hideToolTip()
{
    Action action = getActionMap().get("hideTip");
    if (action != null)
    {
        action.actionPerformed(new ActionEvent(this,
                ActionEvent.ACTION_PERFORMED, "myName"));
    }
}
}
...