Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DoubleClick в JTree, DoubleClick в JTree 
:(
    Опции темы
igon
Дата 27.4.2005, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



В документации на JTree в JDK 1.4 приводится код для "отлавливания"
DoubleClick

Код

 final JTree tree = ...;

 MouseListener ml = new MouseAdapter() {
     public void mousePressed(MouseEvent e) {
         int selRow = tree.getRowForLocation(e.getX(), e.getY());
         TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
System.out.println("ClickCount "+e.getClickCount()); // Добавлено мной
         if(selRow != -1) {
             if(e.getClickCount() == 1) {
//                 mySingleClick(selRow, selPath);
             }
             else if(e.getClickCount() == 2) {
//                 myDoubleClick(selRow, selPath);
             }
         }
     }
 };
 tree.addMouseListener(ml);

Использовал эту рекомендацию, однако отладочная печать при любых кликах, в

том числе и двойных, выдает
Код

ClickCount 1
ClickCount 1
...
ClickCount 1

При этом дерево на DoubleClick разворачивает/сворачивает узел, как и
положено.
DoubleClick, собственно, нужно игнорировать.Что посоветуете?


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 27.4.2005, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Попробуй смотреть не в mousePressed a в mouseClicked.


--------------------

PM   Вверх
igon
Дата 27.4.2005, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Цитата
Попробуй смотреть не в mousePressed a в mouseClicked.

Пробовал, это был даже начальный вариант - не помогат smile

[offtop]
Domestic Cat, с новой "шкуркой" тебя smile
[/offtop]






--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 27.4.2005, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Может код тогда дашь?


Цитата(igon @ 26.4.2005, 21:29)
[offtop]
Domestic Cat, с новой "шкуркой" тебя smile
[/offtop]

Пасип smile


--------------------

PM   Вверх
igon
Дата 27.4.2005, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Код

import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class TreeDemo extends JPanel
  {
    private final JTree tree;

    MouseListener ml = new MouseAdapter() 
      {
        public void mousePressed(MouseEvent e)
          {
            int sourceRow  = tree.getRowForLocation( e.getX(), e.getY());
            if(sourceRow != -1) 
              {
                System.out.println("ClickCount "+e.getClickCount());
              }
          }
      };

    public TreeDemo() 
      {
        super(new GridLayout(1,0));
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Java Series");
        createNodes(top);
        tree = new JTree(top);
        tree.addMouseListener(ml);
        JScrollPane treeView = new JScrollPane(tree);
        add(treeView);
      }

    private void createNodes(DefaultMutableTreeNode top) 
      {
        DefaultMutableTreeNode category = null;
        DefaultMutableTreeNode book = null;

        category = new DefaultMutableTreeNode("Books for Java Programmers");
        top.add(category);

        book = new DefaultMutableTreeNode("The Java Tutorial: A Short Course on the Basics");
        category.add(book);
      }

    private static void createAndShowGUI() 
      {
        JFrame frame = new JFrame("TreeDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TreeDemo newContentPane = new TreeDemo();
        newContentPane.setOpaque(true); 
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
      }

    public static void main(String[] args) 
      {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
      }
  }
Протокол при ОДНОМ DoubleClick
Код

ClickCount 1
ClickCount 2
т.е. листенер вызывается ДВАЖДЫ (в первом посте допустил неточность - sorry). Это так и задумано? Но тогда как различать события?



--------------------
Хотите поговорить об этом?
PM   Вверх
batigoal
Дата 27.4.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 7
Всего: 151



Цитата(igon @ 27.4.2005, 13:50)
Но тогда как различать события?

В смысле? По ClickCount'у и различать...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 27.4.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



А если быстро кликать то и 20 клик каунтов можно получить. Никто ж не знает, сколько кликов ты намереваешься сделать, потому и ловится сначала первый клик.


--------------------

PM   Вверх
igon
Дата 28.4.2005, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



to Lamer George
во фрагменте кода, приведенном в первом посте, на DoubleClick будет вызываться И mySingleClick, И myDoubleClick (закомментированные строчки). А мне нужно, чтобы mySingleClick НЕ вызывался. Это я и называю различением.

to Domestic Cat
Цитата
А если быстро кликать то и 20 клик каунтов можно получить. Никто ж не знает, сколько кликов ты намереваешься сделать, потому и ловится сначала первый клик

Т.е. 20 быстрых кликов == 20 событий.
Мне казалось более логичным:
SingleClick == одно событие
DoubleClick == одно событие
TripleClick == одно событие
...
TwentyClick == одно событие
Что ж, придется принять во внимание smile

Итак, имеем на DoubleClick два вызова листенера
1) При первом вызове выставляем флаг, что-то делаем, запускаем таймер
2) При втором вызове, если флаг выставлен, сбрасываем его и откатываем сделанное
3) таймер просто сбрасывает флаг
или
1) При первом вызове выставляем флаг, готовим задание, запускаем таймер
2) При втором вызове, если флаг выставлен, сбрасываем его
3) таймер выполняет задание, если флаг выставлен, и сбрасывает флаг
Просто и...эта...удобно smile
По другому - никак?


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 28.4.2005, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Ну я не знаю что сделать нужно, но разве нельзя просто игнорировать двойные клики, то есть приравнять их к одинарным?
Цитата(igon @ 27.4.2005, 17:17)
Просто и...эта...удобно smile
По другому - никак?


Ну а как например?
1. При первом вызове не знаем, будут другие или нет, потому ждем.
1.1. Событий нет, посылаем юзеру. Юзер получает событие с заметным запозданием Х.
2. Был двойной клик, ждем, а вдруг нужно 3 клика?
2.1. Событий нет, посылаем юзеру. Юзер получает событие с заметным запозданием 2Х.
3. Был тройной клик, ждем, а вдруг нужно 4 клика?
3.1. Событий нет, посылаем юзеру. Юзер получает событие с заметным запозданием 3Х.
.............


--------------------

PM   Вверх
Stampede
Дата 28.4.2005, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 1
Всего: 144



Цитата(igon @ 28.4.2005, 02:17)
Просто и...эта...удобно


Смеялся smile

Вопрос действительно интересный. С одной стороны, действительно, мы не можем знать, что последний из кликов был на самом деле последним, пока не истечет тайм-аут (кстати, Коть, не 3Х, а время первых двух кликов + Х; что не есть одно и то же - тщательнЕе надо smile ). И значит, система будет всегда подтормаживать. Но ведь имено так и происходит в виндузе, когда мы делаем однократный тык в уже выделенный файл: система ждет полсекунды, а потом открывает имя файла на редактирование!

Встроенной поддержки такого поведения в Java, похоже, нету. Я тут щас погуглил маленько и нарыл топик на форуме Sun. Там один дятел типа думает, что он такой блин умный:

Цитата
Re: mouseClicked evt - how to distinguish dbl click?
Author: dpz  Sep 25, 2003 9:41 AM (reply 1 of 5) 
When you get the single click, the second click hasn't happened yet. Until Java offers us a "ReadUserMind()" method, you wont be able to tell. The best way of not having this problem is to design your UserInterface in such a way that the double click action always follows naturally from the single click action. EG single click selects and double click opens. Any thing else is counter intuitive and hard to use. If the user is slow about the double click, the application will see two single clicks. If the single click action is not what the user wanted when he tried to double click, he will be irritated.


Но шутки шутками, а выходов, похоже, только два: таки реагировать на каждый первый клик или городить ту фиговину с таймерами.

Да, и если выберешь первое, то можно маленько упростить код, не завязываясь на мышиных событиях, а доверив это дело JTree - посредством установки setToggleClickCount(2). Тогда отрабатывать уже нужно будет treeWillExpand() и treeWillCollapse() методы, а в них информация об узле уже включена в объект события.

PM WWW   Вверх
igon
Дата 29.4.2005, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Всем спасибо за комментарии!
В моем конкретном случае (CheckBox в нодах) решил отказаться от анализа числа кликов. Теперь на DoubleClick CheckBox просто дважды инвертирует selected. Побочный эффект - при expand/collapse ветки кратковременно появляется/пропадает галка в CheckBox ветки smile


--------------------
Хотите поговорить об этом?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.