Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Список и всплывающее меню / 8 сообщений из 8, страница 1 из 1
11.11.2006, 17:23:41
    #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
11.11.2006, 20:59:09
    #34121456
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список и всплывающее меню
А в чем собственно проблема?
...
Рейтинг: 0 / 0
11.11.2006, 21:08:11
    #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
11.11.2006, 21:09:24
    #34121464
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список и всплывающее меню
гы, сорри что так перекосило в предыдущем посте...

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

должно быть

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

Код: plaintext
setDefaultCloseOperation(EXIT_ON_CLOSE);

При закрытии окна у Вас не завершается процесс.
...
Рейтинг: 0 / 0
11.11.2006, 21:54:34
    #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
11.11.2006, 22:05:55
    #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
11.11.2006, 22:32:52
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Список и всплывающее меню / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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