powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Список и всплывающее меню
8 сообщений из 8, страница 1 из 1
Список и всплывающее меню
    #34121322
diablero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как прикрутить JPopupMenu к выделенному элементу списка. И обрабатывать события для него от меню. Зацените что не так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
 import  javax.swing.*;
 import  javax.swing.event.ListSelectionEvent;
 import  javax.swing.event.ListSelectionListener;
 import  java.awt.*;
 import  java.awt.event.ActionEvent;
 import  java.awt.event.ActionListener;
 import  java.awt.event.MouseAdapter;
 import  java.awt.event.MouseEvent;

 public   class  test  extends  JFrame

{
    JPopupMenu pm;

    test()
    {
         super ("test");
        Container cp = getContentPane();
        cp.setLayout( new  BorderLayout());

        DefaultListModel lModel =  new  DefaultListModel();
        String array [] =  new  String[]{"1","2","3"};
         int  size = array.length;
         for ( int  i= 0 ; i<size; i++)
        {
            lModel.add(i, array[i]);
        }
        JList list =  new  JList(lModel);
        list.addListSelectionListener( new  ListSelectionL());
        cp.add(BorderLayout.CENTER,list);


        pm =  new  JPopupMenu();
        array =  new  String[]{"a","b","c"};
        size = array.length;
         for ( int  i= 0 ; i<size; i++)
        {
            JMenuItem item =  new  JMenuItem(array[i]);
            item.addActionListener( new  PopupMenuL());
            pm.add(item);
        }

        list.add(pm);
        list.addMouseListener( new  MouseL());
        setSize( 200 , 200 );
        setVisible(true);
        setLocationRelativeTo( null );
    }

     public   static   void  main(String arg[])
    {
         new  test();

    }
     class  PopupMenuL  implements  ActionListener
    {
         public   void  actionPerformed(ActionEvent e)
        {

        }
    }
     class  MouseL  extends  MouseAdapter
    {
         public   void  mouseClicked(MouseEvent me)
        {
             if (SwingUtilities.isRightMouseButton(me))
                pm.show(getContentPane(), me.getX(), me.getX());
        }
    }
     class  ListSelectionL  implements  ListSelectionListener
   {
        public   void  valueChanged(ListSelectionEvent event)
       {

       }
   }
}
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121456
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем собственно проблема?
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121463
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка в

Код: plaintext
pm.show(getContentPane(), me.getX(), [color=red]me.getX()[/color]);

а должно быть

Код: plaintext
pm.show(getContentPane(), me.getX(), [color=green]me.getY()[/color]);

Еще неполохо было бы при обработке нажатия выделять элемент:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
 import  javax.swing.*;
 import  javax.swing.event.ListSelectionEvent;
 import  javax.swing.event.ListSelectionListener;
 import  java.awt.*;
 import  java.awt.event.ActionEvent;
 import  java.awt.event.ActionListener;
 import  java.awt.event.MouseAdapter;
 import  java.awt.event.MouseEvent;


 public   class  Test  extends  JFrame {
    JPopupMenu pm;
    JList list;

    Test() {
         super ("Test");
        Container cp = getContentPane();
        cp.setLayout( new  BorderLayout());

        DefaultListModel lModel =  new  DefaultListModel();
        String array [] =  new  String[]{"1", "2", "3"};
         int  size = array.length;
         for  ( int  i =  0 ; i < size; i++) {
            lModel.add(i, array[i]);
        }
        list =  new  JList(lModel);
        list.addListSelectionListener( new  ListSelectionL());
        cp.add(BorderLayout.CENTER, list);

        pm =  new  JPopupMenu();
        array =  new  String[]{"a", "b", "c"};
        size = array.length;
         for  ( int  i =  0 ; i < size; i++) {
            JMenuItem item =  new  JMenuItem(array[i]);
            item.addActionListener( new  PopupMenuL());
            pm.add(item);
        }

        list.add(pm);
        list.addMouseListener( new  MouseL());
        setSize( 200 ,  200 );
        setVisible(true);
        setLocationRelativeTo( null );
    }

     public   static   void  main(String arg[]) {
         new  Test();

    }

     class  PopupMenuL  implements  ActionListener {
         public   void  actionPerformed(ActionEvent e) {

        }
    }

     class  MouseL  extends  MouseAdapter {
         public   void  mouseClicked(MouseEvent me) {
             if  (SwingUtilities.isRightMouseButton(me)) {
                 int  index = list.locationToIndex(me.getPoint());
                 if  (index != - 1 ) {
                    list.setSelectedIndex(index);
                }

                pm.show(getContentPane(), me.getX(), me.getY());
            }
        }
    }

     class  ListSelectionL  implements  ListSelectionListener {
         public   void  valueChanged(ListSelectionEvent event) {

        }
    }
}
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121464
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гы, сорри что так перекосило в предыдущем посте...

pm.show(getContentPane(), me.getX(), me.getX() );

должно быть

pm.show(getContentPane(), me.getX(), me.getY() );
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121468
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И неплохо было бы в конструктор добавить

Код: plaintext
setDefaultCloseOperation(EXIT_ON_CLOSE);

При закрытии окна у Вас не завершается процесс.
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121491
diablero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это "грязный" пример, для того чтобы объяснить суть проблемы. Попробую словами. Т.е. когда нажимаешь правую кнопку на выделенном пункте меню, то появляется всплывающее меню рядом. А вот если пункт меню списка уже выделен, то при нажатии правой кнопкой в области списка выше, ниже он появляется под курсором. и явно не видно к чему оно относиться.

Я придумал только один способ как это решить. Запоминать позицию курсора при выделении элемента в списке, а когда жмешь правой он появляется на этой позиции

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 static   int  x= 0 ,y= 0 ;
 class  MouseL  extends  MouseAdapter
    {
         public   void  mouseClicked(MouseEvent me)
        {
            
             if (SwingUtilities.isLeftMouseButton(me))
            {
                x = me.getX();
                y = me.getY();
            }

             if (SwingUtilities.isRightMouseButton(me))
                pm.show(me.getComponent(), x, y);
          }
    }

А вот есть еще способы? (так для общего развития)
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121499
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diableroЭто "грязный" пример, для того чтобы объяснить суть проблемы. Попробую словами. Т.е. когда нажимаешь правую кнопку на выделенном пункте меню, то появляется всплывающее меню рядом. А вот если пункт меню списка уже выделен, то при нажатии правой кнопкой в области списка выше, ниже он появляется под курсором. и явно не видно к чему оно относиться.

Я придумал только один способ как это решить. Запоминать позицию курсора при выделении элемента в списке, а когда жмешь правой он появляется на этой позиции

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 static   int  x= 0 ,y= 0 ;
 class  MouseL  extends  MouseAdapter
    {
         public   void  mouseClicked(MouseEvent me)
        {
            
             if (SwingUtilities.isLeftMouseButton(me))
            {
                x = me.getX();
                y = me.getY();
            }

             if (SwingUtilities.isRightMouseButton(me))
                pm.show(me.getComponent(), x, y);
          }
    }

А вот есть еще способы? (так для общего развития)


Лично я ничего не понял! Вы координаты исправили?
...
Рейтинг: 0 / 0
Список и всплывающее меню
    #34121511
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему меню наглядно будет видно, что меню относится к выделенному пункту списка.

Можно сделать так, но это полнейший изврат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 if  (SwingUtilities.isRightMouseButton(me)) {
              if  (list.indexToLocation(list.getLastVisibleIndex()).y < me.getY()) {
                    list.setSelectedIndex(list.getLastVisibleIndex());

                    pm.show(getContentPane(), me.getX(), list.indexToLocation(list.getLastVisibleIndex()).y);
                }  else  {
                     int  index = list.locationToIndex(me.getPoint());
                     if  (index != - 1 ) {
                        list.setSelectedIndex(index);
                    }

                    pm.show(getContentPane(), me.getX(), me.getY());
                }
            }
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Список и всплывающее меню
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]