Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Macintosh mouse problems


Автор: Мишель 24.8.2004, 17:25
Доброе время суток!

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

Так вот, под виндой и линухом все со свистом работает. А вот на Макинтошах возникают проблемы с правой кнопкой мыши, которая должна вызывать popup. Событие генерируется, но меню не всплывает. Причем это имеет не для всех компонент, а для некоторых.
Пробовал вместо нажатия правой кнопки генерировать Ctrl + нажатие левой кнопки. Не помогает.
Если запустить приложение и жать правую кнопку (или Ctrl + левую) руками, все рулит.
В чем грабли?

Мишель

Автор: AntonSaburov 24.8.2004, 17:50
А код можно посмотреть. И надо Domestic Cat подождать - у него как раз Мак есть. Мне аж завидно smile.gif

Автор: Guest 24.8.2004, 18:17
Цитата(AntonSaburov @ 24.8.2004, 17:50)
А код можно посмотреть. И надо Domestic Cat подождать - у него как раз Мак есть. Мне аж завидно smile.gif

К сожалению, код нельзя. Корпоративная собственность, блин.

Автор: Domestic Cat 24.8.2004, 18:25
У меня все работает:

Код

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class test extends JFrame implements MouseListener
{
   JPopupMenu menu = new JPopupMenu();
   public test()
   {
       menu.add("Format C");
       menu.add("Delete Windows");
       menu.add("Kill Bill Gates");
       addMouseListener(this);

       setSize(300, 300);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setVisible(true);
       try
       {
           Robot robot = new Robot();
           robot.delay(2000);
           robot.mouseMove(150, 150);
           robot.mousePress(InputEvent.BUTTON1_MASK);
           Thread.sleep(2000);
           System.exit(0);
       } catch (Exception e) {}
   }

   public void mouseClicked(MouseEvent me)
   {}
   public void mouseEntered(MouseEvent me)
   {}
   public void mouseExited(MouseEvent me)
   {}
   public void mousePressed(MouseEvent me)
   {
       System.out.println("mousePressed : " + me.getButton());

       if (me.getButton() == MouseEvent.BUTTON1)
       {
       menu.show(this, me.getX(), me.getY());
       }

   }
   public void mouseReleased(MouseEvent me)
   {}
   
   public static void main(String [] arguments)
   {
       new test();
   }
}


По-моему, загвоздка в том, что и правая, и левая кнопки мыши имеют код 1.
Можно генерировать и передавать евент с кодом 2, а вот нажать мышку так, чтобы такой
евент сгенерился, не получается.

Автор: Мишель 24.8.2004, 21:50
Цитата(Domestic @ 24.8.2004, 18:25)
У меня все работает:
По-моему, загвоздка в том, что и правая, и левая кнопки мыши имеют код 1.
Можно генерировать и передавать евент с кодом 2, а вот нажать мышку так, чтобы такой
евент сгенерился, не получается.

К сожалению, работает у тебя не совсем то. Мне нужно, чтобы при генерации клика правой кнопкой на компоненте вызывалось popup menu. Автоматически, как это и положено всякой компоненте. Я знаю, что события правого клика в моей проге успешно генерятся. Но меню почему-то не вызывается. Я пытался внутри драйвера мышиных событий автоматически заменять эти события на клик средней кнопки вместо правой или на клик левой кнопки с Ctrl. Не помогает sad.gif

Насчет того, что правая и левая кнопки имеют одинаковый код для Маков - это не так. Проверял уже. Они, как и положено, имеют номер 1 и 3, соответственно маски 16 и 4.

Автор: Domestic Cat 24.8.2004, 21:57
Цитата
Насчет того, что правая и левая кнопки имеют одинаковый код для Маков - это не так. Проверял уже. Они, как и положено, имеют номер 1 и 3, соответственно маски 16 и 4.


Хм, я ловлю маус ивенты и печатаю код баттона - и правая, и левая кнопки дают код 1.

Цитата
  сожалению, работает у тебя не совсем то. Мне нужно, чтобы при генерации клика правой кнопкой на компоненте вызывалось popup menu. Автоматически, как это и положено всякой компоненте.


Видишь ли, у eМака на правую кнопку никаких попапов не выскакивает, только если с контролом, причем даже если делать это вручную, то ни на каком Java-приложении это само по себе не заработает - только если самому показывать попап.
Может, на других и по-другому, но все равно рассчитывать на это не стоит.

Автор: Гость_Irina 25.8.2004, 11:10
Domestic Cat, объясни тогда, пожалуйста, что надо делать, чтобы под MAC Popup Menu увидеть. Наша группа написала приложение на Java Swing для Requirement Engineering и у нас один из заказчиков работает на МАС. При нажатии правой кнопки конткстменю не появляктся. Должны мы что-то в коде менять или заказчик неправильно контекстменю вызывает?

Автор: AntonSaburov 25.8.2004, 11:49
Гость_Irina
Здравствуйте. Мы очень рады, что Вы зашли на наш форум. Если у Вас будет желание и возможность - регистрируйтесь и становитесь полноправным участником нашего форума. Чем больше профессионалов соберется, тем лучше будет для всех.

Автор: Domestic Cat 25.8.2004, 15:06
Цитата
Domestic Cat, объясни тогда, пожалуйста, что надо делать, чтобы под MAC Popup Menu увидеть. Наша группа написала приложение на Java Swing для Requirement Engineering и у нас один из заказчиков работает на МАС. При нажатии правой кнопки конткстменю не появляктся. Должны мы что-то в коде менять или заказчик неправильно контекстменю вызывает?


Создать "вручную" JPopupMenu и показывать его, отлавливая мышиные события, как в примере выше.
Можно тут более подробно прочесть.

http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html#popup
Кстати, а что вообще должно быть в том меню?

Автор: Мишель 25.8.2004, 16:25
Цитата

Цитата
Насчет того, что правая и левая кнопки имеют одинаковый код для Маков - это не так. Проверял уже. Они, как и положено, имеют номер 1 и 3, соответственно маски 16 и 4.


Хм, я ловлю маус ивенты и печатаю код баттона - и правая, и левая кнопки дают код 1.


Я делаю то же самое - мне выдается 1,2,3 для каждой кнопки.
Возможно, дело в том, что я работаю с Маком не напрямую, а через VNC-клиент.

Цитата

Цитата
  сожалению, работает у тебя не совсем то. Мне нужно, чтобы при генерации клика правой кнопкой на компоненте вызывалось popup menu. Автоматически, как это и положено всякой компоненте.

Видишь ли, у eМака на правую кнопку никаких попапов не выскакивает, только если с контролом, причем даже если делать это вручную, то ни на каком Java-приложении это само по себе не заработает - только если самому показывать попап.
Может, на других и по-другому, но все равно рассчитывать на это не стоит.

А у меня вручную правая кнопка работает wow.gif Не поленился сходить туда, где стоит Мак - и там работает нормально. Но бог с ней, в конце концов. Главный вопрос - почему не работает, даже если я заменяю все события на события Ctrl+left click?

Автор: Domestic Cat 25.8.2004, 17:22
А какой Мак у тебя?

Автор: Gretchen 25.8.2004, 17:25
Цитата(Domestic @ 25.8.2004, 15:06)
Создать "вручную" JPopupMenu и показывать его, отлавливая мышиные события, как в примере выше.
Можно тут более подробно прочесть.

http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html#popup
Кстати, а что вообще должно быть в том меню?

Gretchen alias Гость_Irina

Domestic Cat спасибо за ответ. Вообщем-то в проекте PopupMenu вызывается классическим способом, как описано в Sun Swing Tutorial, то есть

if (e.isPopupTrigger()) {
popup.show(e.getComponent(),
e.getX(), e.getY());
}

Обычное context menu для выделенного куска текста.

Под Windows и Linux ни каких проблем не возникает. А вот под МАС якобы меню не появляется. Якобы, потому что я сама не пробовала под МАС запускать приложение, об ошибке сообщает один из заказчиков, который работает с Apple Notebook. И возникает вопрос, действительно приложение, написанное на Java многоплатформенное, или всё-таки могут на других платформах сюрпризы возникать? Должна ли я задумываться, разрабатывая программу в Java, о том, что возможно эта часть кода на MAC OS будет работать по другому.

Автор: Мишель 25.8.2004, 17:37
Цитата(Domestic @ 25.8.2004, 17:22)
А какой Мак у тебя?

А что именно про Мак тебя интересует и как это можно выяснить?

Так все -таки, можешь что-нибудь сказать про события с Ctrl+ left click?

Или может, на Маках как-то по-другому надо попап вызывать? Не так, как в том примере?

Автор: Domestic Cat 25.8.2004, 17:41
Честное слово, не знаю. У меня (MacOSX 10.3.3) все работает. Все что могу придумать - советуется добавлять if (e.isPopupTrigger()) {... и в mausePressed и в mouseReleased для кроссплатформенности.


Автор: Мишель 25.8.2004, 18:13
Цитата(Domestic @ 25.8.2004, 17:41)
Честное слово, не знаю. У меня (MacOSX 10.3.3) все работает. Все что могу придумать - советуется добавлять if (e.isPopupTrigger()) {... и в mausePressed и в mouseReleased для кроссплатформенности.

Да я это делаю...
У меня 10.3.4.
Ладно, спасибо за помощь. Если решится проблема, напишу сюда, может быть, кому-нибудь пригодится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)