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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие MouseClick для MenuItem 
V
    Опции темы
powerOn
Дата 27.1.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 31
Всего: 159



Всем Привет!

Вот есть у меня код:

Код

public class NewJFrame extends javax.swing.JFrame {
    
    public NewJFrame() {
        initComponents();
    }
    
    private void initComponents() {
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();

        getContentPane().setLayout(new java.awt.GridLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jMenu1.setText("Menu");
        jMenuItem1.setText("Item");
        jMenuItem1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jMenuItem1MouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItem1MousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                jMenuItem1MouseReleased(evt);
            }
        });

        jMenu1.add(jMenuItem1);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }

    private void jMenuItem1MouseReleased(java.awt.event.MouseEvent evt) {
        System.out.println("mouse released");
    }

    private void jMenuItem1MousePressed(java.awt.event.MouseEvent evt) {
        System.out.println("mouse pressed");
    }

    private void jMenuItem1MouseClicked(java.awt.event.MouseEvent evt) {
        System.out.println("mouse clicked");
    }
    
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    
}



........... Боже мой! что я только не делал, что бы заставить элемент меню реагировать на щелчок мыши!
Pressed и Released события выполняются, а Cliked нет. Не понимаю.... Помогите разобрться.


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Опытный
**


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

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



"Повесь" на JMenuItem ActionListener

Здесь, скорее всего, внутренние "заморочки" JMenuItem: для него click - сигнал к "сворачиванию". А вот JMenu на экране присутствует постоянно, и на MouseClicked реагирует адекватно.


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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



igon прав, это связанно с тонкостями работы JMenuItem.
Если в JMenuItem запретить обработку события mouseReleased, то событие mouseClicked начнет срабатывать, но при этом меню не будет пропадать с экрана.
Код
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class NewJFrame extends JFrame
{
  private JMenu jMenu1;
  private JMenuBar jMenuBar1;
  private JMenuItem jMenuItem1;

  public NewJFrame()
  {
    initComponents();
  }

  private void initComponents()
  {
    jMenuBar1 = new JMenuBar();
    jMenu1 = new JMenu();
    jMenuItem1 = new JMenuItem()
    {
      protected void processMouseEvent(MouseEvent e)
      {
        if(e.getID() != MouseEvent.MOUSE_RELEASED)
          super.processMouseEvent(e);
      }
    };
    getContentPane().setLayout(new java.awt.GridLayout());
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jMenu1.setText("Menu");
    jMenuItem1.setText("Item");
    jMenuItem1.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent evt)
      {
        System.out.println("mouse clicked");
      }

      public void mousePressed(MouseEvent evt)
      {
        System.out.println("mouse pressed");
      }

      public void mouseReleased(MouseEvent evt)
      {
        System.out.println("mouse released");
      }
    });
    jMenu1.add(jMenuItem1);
    jMenuBar1.add(jMenu1);
    setJMenuBar(jMenuBar1);
    pack();
    setLocationRelativeTo(null);
  }

  public static void main(String args[])
  {
    EventQueue.invokeLater(new Runnable()
    {
      public void run()
      {
        new NewJFrame().setVisible(true);
      }
    });
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Hroft
Дата 30.1.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Гм. Может, я не так понял, но можно про всякие листенеры вообще забыть:
Код

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

public class rr extends JFrame {    
     
    public rr() {    
        initComponents();    
    }    
     
    private void initComponents() {    
        jMenuBar1 = new javax.swing.JMenuBar();    
        jMenu1 = new javax.swing.JMenu();    
        jMenuItem1 = new javax.swing.JMenuItem(new TheSuperAction());    
        getContentPane().setLayout(new java.awt.GridLayout());    
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);    
        jMenu1.setText("Menu");    
        jMenuItem1.setText("Item");    
        jMenu1.add(jMenuItem1);    
        jMenuBar1.add(jMenu1);    
        setJMenuBar(jMenuBar1);    
        pack();    
    }    
    private class TheSuperAction extends AbstractAction {
        public TheSuperAction() {
             putValue(Action.NAME,"Knopochka");
        }
        public void actionPerformed(ActionEvent e) {
             System.out.println("mouse clicked");    
        }
    }
    
    public static void main(String args[]) {    
        java.awt.EventQueue.invokeLater(new Runnable() {    
            public void run() {    
                new rr().setVisible(true);    
            }    
        });    
    }    
     
    private javax.swing.JMenu jMenu1;    
    private javax.swing.JMenuBar jMenuBar1;    
    private javax.swing.JMenuItem jMenuItem1;    
     
}

По-моему, так удобнее. И Экшены можно в отдельный пакет запихать все, и из разных мест их вызывать, не тольок из меню.
PM MAIL ICQ   Вверх
powerOn
Дата 30.1.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 31
Всего: 159



Спасибо за ответы. Анализирую.....


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Опытный
**


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

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



Цитата(Hroft @ 30.1.2006, 13:53 Найти цитируемый пост)

можно про всякие листенеры вообще забыть

Увы, нельзя: события Java - это не только события типа Action. Предложенный тобой вариант не позволит отследить, например, отдельный mousePressed для MouseEvent.



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Цитата(igon @ 31.1.2006, 03:56 Найти цитируемый пост)

отдельный mousePressed

Не позволит. Но когда последний раз это требовалось в меню? Мне - никогда. Я, правда, немного манюшек делал, всего в двух программах smile

PM MAIL ICQ   Вверх
igon
Дата 2.2.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Hroft @ 31.1.2006, 19:30 Найти цитируемый пост)

Цитата(igon @ 31.1.2006, 03:56 )

отдельный mousePressed

Не позволит. Но когда последний раз это требовалось в меню? Мне - никогда. Я, правда, немного манюшек делал, всего в двух программах


mousePressed - это
Цитата(igon @ 31.1.2006, 03:56 Найти цитируемый пост)

например,

поскольку прозвучало в исходном вопросе.
ОК, тогда так:

Предложенный тобой вариант не позволит отследить любые события не-Action типа. Оно нам надо? smile


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Ну ладно, ладно. А можно, все-таки, живой пример, когда
Цитата(igon @ 2.2.2006, 21:47 Найти цитируемый пост)

Оно нам надо

? Мне интересно, какие же еще события МенюИтема столь жизненно необходимы программисту на Яве, главными преимуществами которой, на мой взгляд, являются простота и почти что чистота с точки зрения ООП? Ради чего стоит усложнять связи и отказываться от столь замечательной штуки, как Action?
PM MAIL ICQ   Вверх
LSD
Дата 6.2.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Господа! Давайте не будем углубляться в рассуждения о нужности или не нужности тех или иных событий меню.
Автору вопроса был предложен вариант решения проблемы, если он его не устроит будем думать дальше.

Цитата(Hroft @ 6.2.2006, 12:41 Найти цитируемый пост)
Ради чего стоит усложнять связи и отказываться от столь замечательной штуки, как Action?

Реализация нестандартных меню, например я видел меню в которых были поля ввода, комбобоксы и спинеры.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 6.2.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 31
Всего: 159



Еще раз благодарю за ответы. Я еще раз все пересмотрел и пришел к выводу, что раз уж mouse cliked не хочет работать как мне угодно, то буду использовать mouse released. Он и меню скрывает и код заставит выполниться. smile


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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