JDialog ownership

0

Witam,

chciałbym zrozumieć jaka jest relacja pomiędzy JDialog a właścicielem JDialog (np JFrame).
przykład:
mam JFrame w którym jest JButton. Po naciśnięciu JButton ma pokazać się JDialog na którym wpisuję w JTextField dane. Potem naciskam JButton (w JDialog) i mój JDialog staje się niewidoczny, a wpisane dane mają być dalej przetwarzane przez JFrame.
testowałem dwie wersje kodu: pierwszą w której wszystko działa gdyż konstruktor JDialog przyjmuje za argument obiekt JFrame oraz drugą w której konstruktor JDialog jest bezargumentowy.
w rezultacie druga wersja różni się od pierwszej tym, że po naciśnięciu JButton w JFrame rzeczywiście pojawia się JDialog ale wpisane w nim dane nie są dalej przetwarzane w JFrame.

moje pytanie brzmi: dlaczego?

jeśli zbyt to zagmatwałem mogę dodać kod o który się rozchodzi.

0

zgodnie z prośbą podaję kod mojego JDialog oraz fragment kodu JFrame którego to dotyczy

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class 
ConnectionDialog extends JDialog implements ActionListener{
  protected JButton btnOK;
  protected JButton btnCancel;

  protected JTextField tfHost;
  protected JTextField tfPort;

  protected JLabel lblHost;
  protected JLabel lblPort;

  public boolean OKClicked;
  public String host;
  public String port;

  public ConnectionDialog(JFrame parent)
  {
    super(parent, true);
    setTitle("Parametry połączenia");
    addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent evt)
        {
          dispose();
        }
      }
    );
    initLayout();
    setVisible(true);
  }
  public void initLayout()
  {
    setLayout(new GridLayout(3, 2));
    setSize(250, 100);

    tfHost = new JTextField();
    tfHost.setSize(100, 20);
    tfPort = new JTextField();
    tfPort.setSize(100, 20);

    lblHost = new JLabel("Host");
    lblHost.setSize(100, 20);
    lblPort = new JLabel("Port");
    lblPort.setSize(100, 20);

    btnOK = new JButton("OK");
    btnOK.setSize(100, 20);
    btnOK.addActionListener(this);

    btnCancel = new JButton("Anuluj");
    btnCancel.setSize(100, 20);
    btnCancel.addActionListener(this);

    add(lblHost);
    add(tfHost);
    add(lblPort);
    add(tfPort);
    add(btnOK);
    add(btnCancel);
  }
  public void actionPerformed(ActionEvent evt)
  {
    String tmp = evt.getActionCommand();
    if (tmp.equals("OK")){
      host = tfHost.getText();
      port = tfPort.getText();
      OKClicked = true;
      setVisible(false);
    }
    else if (tmp.equals("Anuluj")){
      OKClicked = false;
      setVisible(false);
    }
  }
}

teraz fragment JFrame:

  public void actionPerformed(ActionEvent evt)
  {
    String tmp = evt.getActionCommand();
    if (tmp.equals("Exit")){
      exitClicked();
    }
    else if (tmp.equals("Disconnect")){
      disconnectClicked();
    }
    else if (tmp.equals("Connect")){
      connectClicked();
    }
  }
  public void connectClicked()
  {
    if(connected){
      insertText("Najpierw zakończ bieżące połączenie!");
      return;
    }
    ConnectionDialog cd = new ConnectionDialog(this);
    if (!cd.OKClicked){
      return;
    }
    int port;
    try{
      port = Integer.parseInt(cd.port);
    }
    catch(NumberFormatException e){
      insertText("Nieprawidłowy numer portu: " + cd.port + "\n");
      return;
    }
    connect(cd.host, port);
  }
  public void connect(String host, int port)
  {
    connected = false;
    insertText("Łączenie z hostem " + host + "\n");
    try{
      socket = new Socket(host, port);
    }
    catch(IOException e){
      insertText("Błąd gniazda: " + e + "\n");
      return;
    }
    insertText("Zakończona inicjalizacja gniazda...\n");
    try{
      socketOut = new DataOutputStream(socket.getOutputStream());
      socketIn = new BufferedReader(
        new InputStreamReader(socket.getInputStream()));
    }
    catch(IOException e){
      insertText("Błąd przy tworzeniu strumieni: " + e + "\n");
      return;
    }
    clientThread = new ChatClientThread(this, socket, socketIn);
    clientThread.start();
    insertText("Połączono z serwerem.\n");
    connected = true;
  }

i tak jak pisałem: w wersji z właścicielem JDialog kod z JFrame następujący po stworzeniu obiektu JDialog jest dalej przetwarzany zgodnie z założeniami natomiast w wersji bezargumentowej jakby to ująć...kończy bieg jak pociąg do Świnoujścia bez tworzenia gniazda

0

wreszcie udało mi się rozwiązać problem...
może ktoś kiedyś będzie miał podobny i to mu się przyda:
otóż metoda setVisible pokazuje okno ale dla modalnych okien (NB!) również zatrzymuje pracę pozostałych wątków aż do momentu gdy zostanie jej przekazany parametr false.
defacto w przypadku modalnych JDialog metoda setVisible(false) ma taki sam wpływ na działanie innych wątków jak metoda dispose()

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