Как сделать JOptionPane "ОК" из дочернего виджета по двойному щелчку - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть JOptionPane, созданный с помощью .showConfirmDialog.Внутри этого находится JPanel, содержащий «материал» (это на самом деле пользовательский браузер проекта для выбора проекта для открытия).

Все работает нормально - я выбираю проект для открытия и нажимаю ОК, и я могу получитьв выбранном проекте из вызывающего класса.Это все идеально.

Однако я хочу дважды щелкнуть мышью на элементе и нажать «ОК» на панели для меня.Двойной щелчок - это не проблема.Что я не могу понять, так это как заставить его выполнять OK.

Я создаю диалог с:

OpenBookPanel info = new OpenBookPanel();
int r = JOptionPane.showConfirmDialog(this, info, "Open Book", JOptionPane.OK_CANCEL_OPTION);
if (r == JOptionPane.OK_OPTION) {
    ... etc ...

И OpenBookPanel является просто расширением JPanelсодержащий JScrollPane и JTable со своим собственным средством визуализации ячеек и пользовательской моделью (источник доступен здесь , если вы этого хотите).

Я думаю, я могу подняться по дереву объектов кдобраться до окружающего диалога изнутри объекта OpenBookPanel, но что мне тогда делать?

1 Ответ

0 голосов
/ 28 сентября 2018

Экспериментируя, я совершенно случайно наткнулся на ответ (он не задокументирован в документах ...)

Шаг первый - пройти по дереву, чтобы найти объект JOptionPane.Это в слушателе MouseEvent, который ищет двойной щелчок:

Component c = (Component)OpenBookPanel.this;
while ((c != null) && (!(c instanceof JOptionPane))) {
    c = c.getParent();
}

Если c не null, то вы нашли JOptionPane.Так что вы можете затем разыграть его правильно.

Теперь волшебный бит.JOptionPane имеет метод setValue:

public void setValue (Object newValue)

Устанавливает значение, выбранное пользователем.

Параметры:

newValue - выбранное значение

См. Также:

getValue ()

Вызовите его с помощью JOptionPane.OK_OPTION, чтобы установить значение параметра, который выхочу выбрать.Теперь, что документы не упоминают, это то, что он не просто устанавливает значение: он активно выбирает значение.Он действует так, как будто пользователь фактически взаимодействовал с диалоговым окном, чтобы выбрать опцию.В тот момент, когда вы устанавливаете значение с помощью этой функции, диалоговое окно закрывается и возвращается выбранное значение.

Вот мой законченный обработчик MouseEvent для справки:

table.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        if (e.getClickCount() == 2 && table.getSelectedRow() != -1) {
            Component c = (Component)OpenBookPanel.this;
            while ((c != null) && (!(c instanceof JOptionPane))) {
                c = c.getParent();
            }
            if (c == null) {
                System.err.println("Could not get option pane!");
            } else {
                JOptionPane op = (JOptionPane)c;
                op.setValue(JOptionPane.OK_OPTION);
            }
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...