[Java] Lista

0

Witam, mam mały problem z listą użytkowników. Sciagam listę z bazy, sprawdzam którzy uzytkownicy są dostępni, a którzy nie. No i chce zrobić tak, żeby np dostępni byli na zielono, a niedostepni na czerwono, tylkoże nie do końca mi to działa. Wierzę, że są tu osoby, które pomogą mi rozwiązać problem, z góry dziękuje.


{
show_kontakt_list()

//pobiera liste kontaktow
 private void show_kontakt_list()
    {
        Statement baza_lista;
        baza_lista=baza.inicjujZapyt();
        ResultSet wynik=null;

        try
        {
            wynik=baza_lista.executeQuery("SELECT * FROM kontakt WHERE nr_komunikatora='"+numer_pobrany_z_bazy+"'");

            while(wynik.next())
            {
                        nr_kont = wynik.getInt("nr_kom_kontakt");
                        String nazwa_danego_kontaktu = wynik.getString("nazwa_kontaktu");

                        model.addElement(nazwa_danego_kontaktu);

                        if(czy_dostepni(nr_kont))
                        {
                        model.addElement(nazwa_danego_kontaktu);
                        //lista.setFont(new Font("Comic Sans MS", Font.PLAIN, 20));
                        lista.setForeground(Color.green);
                                //.setFont(new Font("Comic Sans MS", Font.PLAIN, 20));
                        }
            }
        }
        catch (Exception x)
        {
            baza.konczZapytanie(baza_lista);
            x.printStackTrace();
        }
            baza.konczZapytanie(baza_lista);
    }


//spr czy osoby są dostepne
     private boolean czy_dostepni(int nn)
    {
        Statement pytanko;
        pytanko=baza.inicjujZapyt();
        ResultSet wynik=null;
        boolean spr = false;

        try
        {
            //status=1 i ta osoba MUSI byc na danej liscie kontaktów !!!!!
            wynik = pytanko.executeQuery("SELECT * FROM osoba WHERE status=1 and nr_komunikatora = '" +nn+ "'");

            if(wynik.next())
            {
                spr=true;
            }
        }
        catch (Exception x)
        {
            baza.konczZapytanie(pytanko);
            x.printStackTrace();
        }
            baza.konczZapytanie(pytanko);
            return spr;
    }


}

0

ja tu widzę tylko

lista.setForeground(Color.green);

a gdzie jest red? :)

ps. uzywaj znacznika code=java latwiej czyta sie :)

zapewne tak to trzeba zrobic

if(czy_dostepni(nr_kont)){
 model.addElement(nazwa_danego_kontaktu); 
 lista.setForeground(Color.green); //tylko czy to nie pokoloruje calej listy? :)
} else { 
 model.addElement(nazwa_danego_kontaktu); 
 lista.setForeground(Color.red);
}
0

tak już poprawiam.

No właśnie koloruje mi to całą listę albo na zielono albo na czerwono, bo już próbowałam w ten sposób, ale niestety nic mi to nie dało

0

Zakladam ze lista to jest JList. Musisz stworzyc swoja wlasna impelemntacje interfejsu ListCellRenderer (najlatwiej dziedziczac po DefaultListCellRenderer) i w metodzie: getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) miec taka mniej wiecej logike:

Kontakt k = (Kontakt) value;
if (k.dostepny()) {
ustaw zielony kolor
} else {
ustaw zolty kolor
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

Ta ostatnia linijka zapewni ze to co sie robi normalnie rowniez sie wykona. Tam tez ustawiany jest text, wiec musialbyc przeciazyc metode toString klasy Kontakt aby zwracala tylko nazwisko czy cokolwiek.

Jak widzisz zakladam ze masz klase Kontakt, ale jej nie masz. Zrob ja, moze miec tylko 2 pola: nazwa i dostepny. Cos w ten desen.

0

Dosc niejasno opisalem ustawianie kolorow. Po prostu wywolaj metode setColor() czy tam setBackground itp, DefaultListCellRenderer dziedziczy po JLabel wiec ma takie metody.

0

class ramalogowania extends JFrame
{
    public ramalogowania()
    {
        model = new DefaultListModel();
        lista=new JList(model);
        lista.setSelectionBackground(Color.red);
        lista.setSelectionForeground(Color.yellow);

        lista.setFont(new Font("Comic Sans MS", Font.ITALIC, 15));
        lista.setCellRenderer(new kolorowanie());

        JScrollPane skrol = new JScrollPane(lista);
        panel.add(skrol);

          show_kontakt_list();
         }

private class kolorowanie extends JComponent implements ListCellRenderer
    {
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
        {
//tu musze ustawic to ze dost na zielono a niedost na czerw??

return this;
        }
}

 private void show_kontakt_list()
    {
        Statement baza_lista;
        baza_lista=baza.inicjujZapyt();
        ResultSet wynik=null;

        try
        {
            wynik=baza_lista.executeQuery("SELECT * FROM kontakt WHERE nr_komunikatora='"+numer_pobrany_z_bazy+"'");

            while(wynik.next())
            {
                        nr_kont = wynik.getInt("nr_kom_kontakt");
                        nazwa_danego_kontaktu = wynik.getString("nazwa_kontaktu");

                        model.addElement(nazwa_danego_kontaktu);
                        
            }
        }
        catch (Exception x)
        {
        }
            baza.konczZapytanie(baza_lista);
    }


    private boolean czy_dostepni(int nn)
    {
        ResultSet wynik=null;
        boolean spr = false;

        try
        {
            //status=1 i ta osoba MUSI byc na danej liscie kontaktów !!!!!
            wynik = pytanko.executeQuery("SELECT * FROM osoba WHERE status=1 and nr_komunikatora = '" +nn+ "'");

            if(wynik.next())
            {
                spr=true;
            }
        }
        catch (Exception x)
        {
        }
            baza.konczZapytanie(pytanko);
            return spr;
    }

Mam coś takiego, i trochę nie wiem jak ogarnąć te metody razem i zrobienie tego w cellrenderer. Czy one są ok, czy wywalić? troche sie w tym gubie

0

class Kontact {
public String nazwa;
public boolean dostepny;
}

class ramalogowania extends JFrame
{
public ramalogowania()
{
model = new DefaultListModel();
lista=new JList(model);
lista.setSelectionBackground(Color.red);
lista.setSelectionForeground(Color.yellow);

    lista.setFont(new Font("Comic Sans MS", Font.ITALIC, 15));
    lista.setCellRenderer(new kolorowanie());

    JScrollPane skrol = new JScrollPane(lista);
    panel.add(skrol);

      show_kontakt_list();
     }

private class kolorowanie extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Kontakt k = (Kontakt) value;
if (k.dostepny) {
setBackground(Color.GREEN);
} else {
setBackground(Color.RED);
}
setText(k.nazwa);
return this;
}
}

private void show_kontakt_list()
{
Statement baza_lista;
baza_lista=baza.inicjujZapyt();
ResultSet wynik=null;

    try
    {
        wynik=baza_lista.executeQuery("SELECT * FROM kontakt WHERE nr_komunikatora='"+numer_pobrany_z_bazy+"'");

        while(wynik.next())
        {
                    Kontakt k = new Kontakt();
                    k.nazwa = wynik.getString("nazwa_kontaktu");

                    nr_kont = wynik.getInt("nr_kom_kontakt");

                    model.addElement(nazwa_danego_kontaktu);
                   
        }
    }
    catch (Exception x)
    {
    }
        baza.konczZapytanie(baza_lista);
}


private boolean czy_dostepni(int nn)
{
    ResultSet wynik=null;
    boolean spr = false;

    try
    {
        //status=1 i ta osoba MUSI byc na danej liscie kontaktów !!!!!
        wynik = pytanko.executeQuery("SELECT * FROM osoba WHERE status=1 and nr_komunikatora = '" +nn+ "'");

        if(wynik.next())
        {
            spr=true;
        }
    }
    catch (Exception x)
    {
    }
        baza.konczZapytanie(pytanko);
        return spr;
}
0

Sory zle mi sie kliknelo, ta petla powinna wygladac tak:

while(wynik.next())
{
Kontakt k = new Kontakt();
k.nazwa = wynik.getString("nazwa_kontaktu");
nr_kont = wynik.getInt("nr_kom_kontakt");
k.dostepny = czy_dostepni(nr_kont);

                    model.addElement(k);
                   
        }

Cos takiego, ale nie wiem czy zadziaal bo pisalem bez ide.

0

O dziękuję za pomoc !!!!! tylko wychodzi że dla super nie ma metody getList...
I podkreśla, że setText(k.nazwa) nie isntnieje taka met

0

To dziwne bo DefaultListCellRenderer dziedziczy po JLabel i implementuje ListCellRenderer, czyli obie metody ma. Sprawdz czy nie ma gdzies literowki.

0

Nie przepraszam, pomyłka moja.
WSZYSTKO DZIAŁA !! DZIĘKUJĘ za pomoc, bardzo mi pomogłeś !!

0

Ale mam jeszzce jedno pytanko, bo wcześniej działał mi listener dla wybranego elementu. W klasie rama_logowania jest coś takiego :


        MouseListener mouseListener = new MouseAdapter() {
            @Override
            public void mouseClicked(final MouseEvent e) {
                if (e.getClickCount() == 2)
                {

                String wybrana_osoba = lista.getSelectedValue().toString();
                System.out.println("wybrales " + wybrana_osoba);
                
                }
    }
};

        lista.addMouseListener(mouseListener);

wyswietlana byla nazwa elementu, a teraz sa jakies inne informacje wyswietlane i nie wiem czy to trzeba zapisac rowniez w tym cellrenderer ??

0

public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2)
{

            Kontakt k = (Kontakt) lista.getSelectedValue();
            System.out.println("wybrales " + k.nazwa);
           
            }

Model / lista teraz bedzie zwracac obiekty typu Kontakt, dlatego to rzutowanie.

0

Nie czytałem całego postu, bo najprawdopodobniej już Ci pomogli, mam za to jedną drobną uwagę, jak już uparłeś się na nazewnictwo z podkreśleniem, to ok, ale :

private boolean czy_dostepni(int nn)

sprawdzasz 1 numer, nazwij to

private boolean czy_dostepny(int nn)

Sam sobie usprawnisz i uprzyjemnisz późniejsze modyfikacje/pielęgnacje kodu.

0

dzięki, wezmę to pod uwagę.
A mam jeszcze pytanie. Myślę o dodaniu popup menu do listy.
Dodaję taki kod, tylko jak zrobić żeby do menu dotyczyło sie jakby kazdego elementu listy a nie listy ogolnie ??


JPopupMenu popup = new JPopupMenu();
        JMenuItem menu_it = new JMenuItem("Dane uzytkownika");
        menu_it.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e) 
           {
               JOptionPane.showMessageDialog(null, "cos tu bedzie");
           }
        });
        popup.add(menu_it);

        lista.setComponentPopupMenu(popup);

0

mógłbyś sprawdzać, który z elementów listy jest wybrany, i na tej podstawie wybierać, które informacje wyświetlić.

0

Ale w popupie możesz przecież sprawdzać, który element jest wybrany. Albo użyć locationToIndex() na liście.

0

A mam jeszcze jedno pytanie odnośnie tej listy, bo nie mogę zrobić tego żeby po kliknieciu od razu został usuniety element z listy. wklejam moj kod. Mam jakies menu klikam usun tam wpisuje nazwe ktora chce usunac i mi to nie działa, probuje to zrzutowac na klase kontakt, ale nie działa mi to. Prosze tylko o zerkniecie na ta jedna rzecz

        usunitem.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {

               Kontakt pp = new Kontakt();
               pp.nazwa = JOptionPane.showInputDialog("podaj osobe do usuniecia");

               model.removeElement(pp);
           }
        });

Jeszcze dodam, że to samo tylko addElement dziala i dodaje do listy.

0

Naprawdę nikt nie może mi pomóc ?? będę meeeeega wdzięczna, bo to jest mi strasznie potrzebne

0

@smakporanka:
Tak jak robisz to nie zadziała. Bo najpierw tworzysz NOWY obiekt klasy Kontakt -- jest to zupełnie nowy obiekt, tyle że jego pole nazwa ma taką samą wartość, jak pole nazwa w INNYM obiekcie na liście -- a potem próbujesz ten nowy obiekt usunąć. Tymczasem nigdy go nie było na liście w pierwszej kolejności.

Nie mam pod ręką Javy, więc nie mogę tego sprawdzić, ale mogę Ci dać parę podpowiedzi.

Mogłabyś w klasie Osoba nadpisać metodę equals jakoś tak, żeby dwie osoby były równe gdy mają takie same nazwy. Założenia Twojego systemu mogą jednak nie dopuszczać takiej możliwości (jeśli nazwa nie jest unikalna). W tym wypadku przeiteruj się (pętla for ze zwykłymi indeksami) przez wszystkie elementy w modelu i sprawdzaj po kolei, czy nazwa danego elementu równa się (equals) temu, co zwróciło okno dialogowe. Jeśli są równe, to użyj metody modelu o nazwie removeElementAt(index), której za parametr podasz index pasującego elementu. Powinno zadziałać.

0
               Kontakt pp = new Kontakt();
               pp.nazwa = JOptionPane.showInputDialog("podaj osobe do usuniecia");

               model.removeElement(pp); 

Usuwasz z modelu element pp, którego w nim nie ma - utworzyłaś go przecież dwa wiersze wcześniej. Jeżeli nazwa jest niepowtarzalna, to zrób tak

               String n = JOptionPane.showInputDialog("podaj osobe do usuniecia");

potem wyszukaj w modelu elementu ob takiego, że ob.nazwa.equals(n) i ten znaleziony usuń.

0

Aaa faktycznie, to było nielogiczne ;)
Czyli tak, robię coś takiego


usunitem.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {
               String do_usuniecia = JOptionPane.showInputDialog("podaj osobe do usuniecia"); 
                
               for(int i=0; i<model.size(); i++)
               {

                        if(k.nazwa.equals(do_usuniecia))
                            {
                       model.removeElementAt(i);
                           }
               }
                
           }
        });

Tylko, że coś dalej źle robię, bo juz czasem usuwa cos tylko nie to co trzeba ;]
To jest pewnie proste, ale pogubilam sie troche po zamianie tej listy na Kontakt i generalnie probuje to sklecic ale za kazdym razem cos jest nie tak;/

0

@smakporanka:
No coś na pewno robisz źle, jeśli wkleiłaś całość kodu odpowiedzialnego za to usuwanie :). Zobacz sobie, co tu porównujesz?

if(k.nazwa.equals(do_usuniecia))<

do_usuniecia to wiadomo, ale co to jest to k? Który to kontakt? Chyba zapomniałaś go ustawić przy każdy przebiegu pętli na i-ty kontakt i jeśli to Ci czasami działa to tylko dlatego, że w klasie czy gdzieś indziej w funkcji wywołującej masz zmienną k będącą kontaktem!

Musisz zrobić tak:

               for(int i=0; i<model.size(); i++)
               {
                        Kontakt sprawdzany_kontakt = (Kontakt)model.get(i);
                        if(sprawdzany_kontakt.nazwa.equals(do_usuniecia))
                        {
                                model.removeElementAt(i);
                        }
               }

Teraz w zmiennej sprawdzany_kontakt (którą wprowadziłem zamiast k) masz zawsze obiekt i-tego kontaktu (czyli tego sprawdzanego w bieżącym przebiegu pętli).

BTW. mam w zwyczaju jechanie ludzi za to, ale Ty się w niektórych momentach wyróżniasz pozytywnie jak na niezbyt zaawansowaną osobę, więc niniejszym chciałbym przyznać, że -- przynajmniej miejscami -- masz dobrze ponazywane zmienne. do_usuniecia, wybrana_osoba -- cool. Tzn. osobiście nie przepadam za nazwami polskimi (gdy wywołania bibliotek są z konieczności po angielsku), no i używasz notacji_z_podkreśleniami zamiast zwykle stosowanej w Javie notacjiWielbłądziej, ale jesteś pod tym względem spójna, a same nazwy są dość często OK. Normalnie często się widzi w jednym miejscu trzy zmienne typu "k", "kontakt", "kontakcik", "poprzedni", "dane" i inne tego typu zlepki.

Miejscami gorzej jest niestety z wcięciami w kodzie. Też powinny być spójne, u dobrych programistów ZAWSZE są (ew. mają pewne niespójności w skomplikowanych przypadkach). Więcej o wcięciach tutaj: http://en.wikipedia.org/wiki/Coding_standard#Indenting

0

Aaa DZIAŁA :D dziękuję za pomoc, nareszcie mogę ruszyć dalej - chcę zrobić takie popupmenu tak zeby klkajac na uzytkownika pobral mi np jego nazwe i potem majac ta nazwe wyszukam informacje na jego temat, ale zobaczymy co z tego wyjdzie :)!!! Jeszcze raz dzięki za wszystkie rady, jeszcze muszę się meeeega dużo nauczyć ;)

0

Mam jeszcze jedno, ostatnie już pytanie odnośnie tej listy. Chcę zrobić takie odświeżanie. Naciskam na przycisk i jest sprawdzana dostępność każdego z użytkowników, jeżeli ktoś niedostepny jest juz dostepny to jego kolor zmienia sie na zielono lub na odwrót. Myśle żeby to zrobić tak, ale nie wiem czy to słuszna logika, nie wiem tez jak sie zabrac za to kolorowanie, bo probuje roznych rzeczy i np zmienia mi wszystko na zielono. Proszę, proszę jeszcze raz o pomoc ;)

        odswiez.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {
               for(int i=0;i<model.size();i++)                     //bedzie przechodzil przez elementy i spr kazdego
               {

                   Kontakt sprawdzany = (Kontakt) model.get(i);
                   sprawdzany.dostepny = czy_dostepni(nr_kont);       //nie wiem jak sie odwolac do tego kolorowania

               }
           }
        });

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