rozszerzenie klasy JDialog i pobranie z niej danych

0

Witam,

Próbuję stworzyć rozszerzenie klasy JDialog i zwrócić z niej informację do głównego okna. Przykłady wygoglowane i oracle nie pomagają mi rozwiązać problemu bo nigdzie nie ma przykłady który by przypominał coś co chcę zrobić. Mianowicie w konstruktorze klasy dziedziczącej po JDialog chciałbym umieścić dane do wypełniania dwóch list. Całość działa poprawnie po za jednym mankamentem
. Nie jestem w stanie w żaden sposób wymyślić jak przekazać wynik działania mojej klasy do głównego programu

Klasa dziedzicząca po JDialog

poproszę o jakąś sugestię jak to wywołać żeby można było zgarnąć dowolnie albo adresy na oby wybranych listach
bądź też tekst

pozdrawiam

 
package Okno;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 *
 * @author w.maciejewski
 */
public class JWyborPlayerki extends JDialog implements ActionListener ,ListSelectionListener{
    private final JList listagrup;
    private  JList listaplayerek;
    private final JButton zatwierdz;
    private final JButton anuluj;
    private final DefaultListModel listagrupmod;
    private  DefaultListModel listaplayeremod;
    private ArrayList<String[]> playerkii;
    public String doplay;
   
    public  JWyborPlayerki(String[] nazwy,String[] grupy, ArrayList<String[]> playerki){
    playerkii=playerki;    
    setSize(420,350);
    setVisible( true ); 
    listagrupmod=new DefaultListModel();
    listaplayeremod=new DefaultListModel();
    
    for(int i=0;i<grupy.length;i++){
        listagrupmod.addElement(grupy[i]);
    }
    
    
    
    
    listagrup = new JList(listagrupmod);
    listaplayerek=new JList(listaplayeremod);
    zatwierdz=new JButton(nazwy[3]);
    anuluj=new JButton(nazwy[4]);
    getContentPane().setLayout(new BorderLayout());
    
    JLabel jgrupt=new JLabel(nazwy[5]);
    JLabel jplayert=new JLabel(nazwy[6]);
    

    
    JPanel textpanel=new JPanel(new GridLayout(0,2));
    getContentPane().add(textpanel,BorderLayout.NORTH);
    
    textpanel.add(jgrupt)  ;   
    textpanel.add(jplayert)  ;
   
    JPanel listpanel=new JPanel(new GridLayout(0,2));
    getContentPane().add(listpanel,BorderLayout.CENTER);
    
    listpanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
    listpanel.add(listagrup)  ;
    listaplayerek.setBorder(BorderFactory.createLineBorder(Color.BLUE));
    listagrup.setBorder(BorderFactory.createLineBorder(Color.BLUE));
    listpanel.add(listaplayerek)  ;
    listagrup.addListSelectionListener(this);
    listaplayerek.addListSelectionListener(this);
    
    JPanel butonpanel=new JPanel(new GridLayout(0,2));
    zatwierdz.setEnabled(false);
    zatwierdz.addActionListener(this);
    anuluj.addActionListener(this);
    getContentPane().add(butonpanel,BorderLayout.SOUTH)  ;
    butonpanel.add(zatwierdz);
    butonpanel.add(anuluj)  ;
    
    getContentPane().repaint();
    }

    
  


    
    @Override
    public void actionPerformed(ActionEvent e) {
       
        Object source = e.getSource();
        if(source==zatwierdz)
        {
           int j=listagrup.getSelectedIndex();
           
           String kila=(String) listagrupmod.getElementAt(j);
           int k=listaplayerek.getSelectedIndex();
           
           String kila1=(String) listaplayeremod.getElementAt(k);
            doplay=kila+"\\"+kila1;
           
           dispose();
        }else
            if(source==anuluj){
             dispose();   
            }
        
      
    }

    @Override
    public void valueChanged(ListSelectionEvent lse) {
        Object source=lse.getSource();
        if(source==listagrup){
            
           int j=listagrup.getSelectedIndex();
           
           String[] kila=playerkii.get(j);
           listaplayeremod.removeAllElements();
           for(int i=0;i<kila.length;i++){
               listaplayeremod.addElement(kila[i]);
           }
         
        }
        if(source==listaplayerek){
        zatwierdz.setEnabled(true);    
        }
    }
}
0

Nie znam się za dobrze, ale możesz np. stworzyć w klasie będącej "głównym programem" metodę public static i do niej wysyłać jakąś zmienną. Static zadziała w ten sposób, że można skorzystać z metody bez potrzeby konstruowania obiektu.

0

W konstruktorze klasy JWyborPlayerki przekaż referencję do głównego okna. Pod koniec obsługi klawisza zatwierdz (przed dipose()), przekaż, korzystając z przekazanej referencji, wpisane informacje do głównego okna.

0

Hm... u mnie działa to tak, że w dialogu ustawiam sobie jakieś zmienne w których zapisuje wybory, tworzę metody get tak bym mógł je odczytać i po zamknięciu okna dialogowego w dalszej części programu normalnie używam metod get na obiekcie dialog : ) Zrobiłem tak, żeby to była oddzielna klasa nie mająca nic wspólnego z oknem głownym.

Mam modalny dialog

0

@Swr. twoje rozwiązanie nie pasuje do zamieszczonego kodu. należałoby zamienić dispose() na setVisible(false). Druga sprawa, jak główne okno rozpoznaje, że użytkownik właśnie zatwierdził dane w oknie dialogowym?

0

Nie mam teraz kodu pod ręką ale też używam dispose() pod buttonem OK, wtedy dialog się zamyka i program idzie dalej, bo wcześniej się wstrzymał na tym oknie. A czy zatwierdził czy dał anuluj hm... no ustawiam sobie flagę jaka operacja została wykonana i w zależności od tej flagi tak obsługuje w dalszej części programu.

0

Ta flaga jest static, czy przekazujesz jakąś referencję do JDialog? Pierwsze rozwiązanie jest be, a przy drugim, nie prościej, żeby JDialog wprowadził zmiany skoro już ma referencję?
Z dispose() masz rację.

0
bogdans napisał(a):

Ta flaga jest static, czy przekazujesz jakąś referencję do JDialog? Pierwsze rozwiązanie jest be, a przy drugim, nie prościej, żeby JDialog wprowadził zmiany skoro już ma referencję?

Nie przekazuje, flaga nie jest static, jest zmienną w moim obiekcie JDialog. Przy wywołaniu dialog blokuje działanie reszty programu( to chyba przez modalność? ), po zamknięciu wykonywany jest dalszy kod znajdujący się za wywołaniem dialogu, sprawdzam flagę z JDialog czy było potwierdzenie czy zamknięcie, jeśli potwierdzenie to wyciągam wartości z dialogu i robię z nimi to co mi potrzebne.

W każdym razie działa mi to bez problemu i chciałem by klasa była oddzielna bez powiązań z głównym oknem.

0

Zgoda, Twój sposób jest lepszy jeśli okna dialogowe otwieramy modalnie. Jedno z okien musi mieć referencję do drugiego. W Twoim sposobie, główne okno ma w naturalny sposób referencję do okna dialogowego, w moim sposobie trzeba do okna dialogowego przekazać referencję do okna głównego. Mój sposób działa również wtedy, gdy okno dialogowe nie jest otwierane modalnie.

0

hmm dzięki za pomoc ale mam kilka problemów.

  1. Ustawienie modalności okna ani w samym konstruktorze klasy ani w programie głównym poprzez komendę setModal(true); nie zmienia w żaden sposób działania programu

  2. jeżeli tworzę funkcję getString() która teoretycznie powinna zwracać referencję do String doplay to spod klasy głównej nie widzę tej funkcji.........

  3. Sposób z podaniem w konstruktorze zmiennej String i przekazanie referencji nie działa nie wiem czemu.....

0

W klasie głównej masz

if(dialog == null)
{
   dialog = new JWyborPlayerki(this,true);
}
dialog.setVisible(true);
... = dialog.getString();

Metoda getString() nie jest prywatna i kompilator twierdzi, że metody getString() nie ma?

0

hmm no właśnie o to chodzi że nie mogę w parametrze konstruktora podać (this, true) bo mam inne rzeczy w konstruktorze..........chyba że dodać do konstruktora na początku zmienne JFrame i Modal
ale nie wiem co to da

metoda getString jest na bank publiczna

0

Jeśli okno dialogowe jest otwarte modalnie, to w głównym oknie nic nie możesz zrobić. Jeśli masz kod

dialog.setVisible(true);
//odczytanie wartości z okna dialogowego

to odczytanie odbędzie się po zamknięciu okna dialogowego. Jeśli okno dialogowe nie jest otwarte modalnie, to nie wiesz kiedy masz odczytywać jego zawartość. Wtedy musisz działać odwrotnie, okno dialogowe tuż przed zamknięciem (przed dispose()) informuje o swojej zawartości.
Zmienna dialog jest typu JDialog, czy typu JWyborPlajerki? Jeśli jest typu JDialog, to musisz rzutować

((JWyborPlajerki)dialog).getString();
0

Super poradziłem sobie :)

błąd tkwił w tym że setVisible nie był w klasie głównej a siedział w środku konstruktora. Wtedy funkcja setModal() wywoływana spod programu głównego nie działała. Po usunięciu setVisible z konstruktora i wpisaniu kodu jak poniżej

            jwp=new JWyborPlayerki( nazwy,kod,listap);
            jwp.setModal(true);
            jwp.setVisible(true);
            System.out.print(jwp.getString());

działa tak jak chciałem. Co prawda nie mam zielonego pojęcia dlaczego ale ważne że działa.

Dzięki piękne wszystkim

pozdrawiam i do następnego

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