JTable I MouseAdapter

Odpowiedz Nowy wątek
2015-02-03 04:15
0

Witam.
Mój Problem polega na tym, że chciałbym zrobić w tabeli akcje myszy która zachowuje się jak ikony w Windowsie, czyli...
Gdy najadę na jakiś wiersz w tabeli i wcisnę prawy myszki to tabelka się zaznacza i wyswietla się PopupMenu...
Gdy zaznaczę sobie kilka wierszy w tabeli (lewy myszki i ctrl) i najadę kursorem na jednen z zaznaczonych wierszy, klikając prawy myszki to wyswietla się do nich PopupMenu
Ale gdy mam zaznaczone kilka wierszy w JTable i najadę kursorem na nie zaznaczony wiersz, wciskając przy tym prawy myszy to wyswietla się JPopupMenu do tych zaznaczonych wierszy, a nie do tej nie zaznaczonej...
Męczę się nad tym juz 3 dni i nie mogę tego rozgryźć...
kod :

tabela.addMouseListener(new MouseAdapter() 
        {
            @Override
            public void mouseReleased(MouseEvent e) 
            {
                int r = tabela.rowAtPoint(e.getPoint());

                if (r>= 0 && r < tabela.getRowCount()) 
                {
                    if(tabela.getSelectedRowCount()<=1)
                        tabela.setRowSelectionInterval(r, r);
                    else if((tabela.getSelectedRowCount()>1)&&( tabela.rowAtPoint(e.getPoint())!=r))
                    {

                            tabela.clearSelection();
                            tabela.setRowSelectionInterval(r, r);

                    }
                } 
                else
                    tabela.clearSelection();

                int rowindex = tabela.getSelectedRow();
                if (rowindex < 0)
                {

                    return;
                }

                if (e.isPopupTrigger()) 
                {
                    Edycja.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });
edytowany 1x, ostatnio: mateusz1406, 2015-02-03 04:18

Pozostało 580 znaków

2015-02-03 19:04
0

Nikt nie pomoże? ...

Pozostało 580 znaków

2015-02-03 19:48
0

Jaka Java? Jaki system? U mnie Twój kod działa (chyba) zgodnie z Twoimi oczekiwaniami. Piszę chyba, bo nie jestem pewien co znaczy "do tych" w tym zdaniu:

wyswietla się JPopupMenu do tych zaznaczonych wierszy


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-02-03 19:49
Bogdans, i jak ? sprawdzałeś teraz ? - mateusz1406 2015-02-03 21:16

Pozostało 580 znaków

2015-02-03 20:37
0

Java najnowsza, Win 7 x64 , Zaznacz sobie na pulpicie kilka plików (ctrl + lewy myszki), a następnie kliknij prawym na nie zaznaczony plik to zrozumiesz o co mi chodzi :P odznacząją się te zaznaczone wczesniej pliki i zaznacza się nowy plik i do niego wyskakuje menu ;) chodzmi o taką samą funkcjonalność tylko ze w tabeli ;s A i jeszcze mam problem do tego, że gdy wyjde poza obszar tabeli, (czyli akcja MouseExited) i gdy wcisne lewy myszki, to wszystkie pola się nie odznaczają ;)

public void mouseExited(MouseEvent e)
            {
                if((SwingUtilities.isLeftMouseButton(e)))
                tabela.clearSelection();
            }
edytowany 1x, ostatnio: mateusz1406, 2015-02-03 20:41

Pozostało 580 znaków

2015-02-03 23:57
0

Na razie pierwszy problem.

                int r = tabela.rowAtPoint(e.getPoint());
                ...
                    else if((tabela.getSelectedRowCount()>1)&&( tabela.rowAtPoint(e.getPoint())!=r))
                    {

                            tabela.clearSelection();
                            tabela.setRowSelectionInterval(r, r);

                    }

Warunek w else if nigdy nie będzie spełniony =>kod zmieniający zaznaczenie nigdy się nie wykona. Zmień warunek na

else if((table.getSelectedRowCount()>1)&&e.isPopupTrigger())

Jeśli chodzi to drugi problem, to zupełnie źle kombinujesz. Metoda mouseExited jest wywoływana w momencie gdy kursor opuszcza tabelę, późniejsze kliknięcia nie są już widziane wewnątrz tej metody. Musiałbyś dodać MouseListenera do reszty okna.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-02-04 00:08

Pozostało 580 znaków

2015-02-04 00:23
0

Tak, ale teraz nie działa ta opcja...
""Gdy zaznaczę sobie kilka wierszy w tabeli (lewy myszki i ctrl) i najadę kursorem na jednen z zaznaczonych wierszy, klikając prawy myszki to wyswietla się do nich PopupMenu""

Pozostało 580 znaków

2015-02-04 00:27
0

Chodzi mi dokladnie o to, że gdy kursor myszki NIE jest na jednym z kilku wczesniej zaznaczonych wierszy to powinno się wyswietlic PopUp menu tylko do tego jednego wiersza( gdzie aktualnie znajduje się kursor myszki), a gdy kursor jest na jednym z kilku zaznaczonych wierszy to kursor powinnien wyswietlic menu dla tych wszystkich zaznaczonych wierszy :s

edytowany 1x, ostatnio: mateusz1406, 2015-02-04 00:28

Pozostało 580 znaków

2015-02-04 00:38
0

Czym się różni "wyświetlić PopUp menu tylko dla tego jednego wiersza" od "wyświetlić menu dla tych wszystkich zaznaczonych wierszy"? Może musisz przekazać odpowiednie parametry do metody show?

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

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-02-04 00:38

Pozostało 580 znaków

2015-02-04 00:45
0

Różni się to tym, że np. jak chcę usuwać/kopiować rekordy to ciężko robić to pojedynczo(A w opcjach popmenu mam wlasnie te usuwanie/kopiowanie), ale tez gdy chce zaznaczyc jeden wiersz prawym myszki i przy tym uruchomic Popup menu to dla jednego mają byc te opcje rownież dostepne... i tak jak wspomnialem wczesniej, z tym kursorem i zaznaczonymi wierszami.. Ciężko to wytłumaczyć słownie, najlepiej przyjrzeć się jak działa kursor myszki i jej przyciski na folderach/plikach w jakims folderze albo na pulpicie.

Pozostało 580 znaków

2015-02-04 02:41
0

Zrobione! :D Zostawiam dla potomnych :

public void mouseReleased(MouseEvent e) 
            {
                int index_wiersza = tabela.rowAtPoint(e.getPoint());

                if (e.isPopupTrigger()) 
                {

                        if(tabela.getSelectedRowCount()<=1)
                            {
                                tabela.setRowSelectionInterval(index_wiersza, index_wiersza);
                                System.out.println(index_wiersza);
                            }
                        else
                        {
                            int[] zaznaczone_wiersze = tabela.getSelectedRows();

                            int czy_ppm_na_zaznaczonym_wierszu=0;
                            for(int i=0;i<tabela.getSelectedRowCount();i++)
                            {
                                if(index_wiersza==zaznaczone_wiersze[i])
                                    czy_ppm_na_zaznaczonym_wierszu++;

                            }
                            if(czy_ppm_na_zaznaczonym_wierszu==0)
                            {
                                tabela.clearSelection();
                                tabela.setRowSelectionInterval(index_wiersza, index_wiersza);
                            }

                        }

                    Edycja.show(e.getComponent(), e.getX(), e.getY());
                }
            }

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0