Почему не удается закрыть Java должным образом, хотя я использую dialog.dispose ()? - PullRequest
2 голосов
/ 17 октября 2011

Я публикую полный код ниже, но в основном у меня есть класс, в котором есть диалог, содержащий полосу прокрутки, которая содержит jlist. Для него установлено значение «DISPOSE_ON_CLOSE», и я попытался установить для каждой отдельной переменной, которая когда-либо создавалась, значение NULL после получения значения, но javaw.exe будет продолжать работать бесконечно, пока я не принудительно закрою его.

В случае, если требуется дополнительная информация, вот краткое объяснение. Этот класс предназначен для создания диалога и его отображения, ожидания ввода пользователя и возврата выбранного текста. Это уже делает это. Но по какой-то причине он продолжает работать в фоновом режиме после завершения.

Это предназначено для приложения, поэтому запуск Java в фоновом режиме без остановок не является привлекательной перспективой. Я действительно не знаю, что еще можно попробовать на этом этапе. Ниже мой код.

package (REMOVED);

import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class PatientScrollPane implements ListSelectionListener, MouseListener {
    private String currentPatient;
    private JList patientList;
    private JDialog dialog;
    private JFrame frame;
    private JScrollPane scrollPane;
    private static int MAX_VISIBLE_ROW_COUNT = 15;

    public void setDialog(JDialog dialog) {
        this.dialog = dialog;
    }

    public JList getPatientList() {
        return patientList;
    }

    public void setPatientList(JList patientList) {
        this.patientList = patientList;
    }

    public String getCurrentPatient() {
        return currentPatient;
    }

    public void setCurrentPatient(String currentPatient) {
        this.currentPatient = currentPatient;
    }

    public JDialog getDialog() {
        return dialog;
    }

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        this.frame = frame;
    }

    public JScrollPane getScrollPane() {
        return scrollPane;
    }

    public void setScrollPane(JScrollPane scrollPane) {
        this.scrollPane = scrollPane;
    }

    public PatientScrollPane() {
        this(null);
    }

    public PatientScrollPane(JComponent locationRelativeToComponent) {
        this(locationRelativeToComponent, new JList(fakePatientList()));
    }

    public PatientScrollPane(JComponent locationRelativeToComponent, JList patientList) {
        this.patientList = patientList;
        patientList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        frame = new JFrame("Patient List");

        dialog = new JDialog(frame);
        dialog.setLocationRelativeTo(locationRelativeToComponent);

        patientList.addListSelectionListener(this);
        patientList.addMouseListener(this);
        setVisibleRowCount();

        scrollPane = new JScrollPane(patientList);
        dialog.getContentPane().add(scrollPane, BorderLayout.CENTER);

        dialog.pack();
        dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        dialog.setModalityType(ModalityType.APPLICATION_MODAL);
        dialog.setVisible(true);
    }

    private void setVisibleRowCount() {
        int size = patientList.getModel().getSize();

        if(size <= MAX_VISIBLE_ROW_COUNT) {
            patientList.setVisibleRowCount(size);
        } else {
            patientList.setVisibleRowCount(MAX_VISIBLE_ROW_COUNT);
        }
    }

    public static String[] fakePatientList() {
        String[] patients = new String[20];
        for(int i = 0; i < patients.length; i++) {
            patients[i] = "Patient " + i;
        }

        return patients;
    }

    public static String getPatient() {
        PatientScrollPane patientScrollPane = new PatientScrollPane();
        String patient = patientScrollPane.getCurrentPatient();
        patientScrollPane.setPatientList(null);
        patientScrollPane.setDialog(null);
        patientScrollPane.setCurrentPatient(null);
        patientScrollPane.setFrame(null);
        patientScrollPane.setScrollPane(null);
        patientScrollPane = null;

        return patient;
    }

    public static String getPatient(JComponent locationRelativeToComponent) {
        PatientScrollPane patientScrollPane = new PatientScrollPane(locationRelativeToComponent);

        return patientScrollPane.getCurrentPatient();
    }

    public static String getPatient(JComponent locationRelativeToComponent, JList patientList) {
        PatientScrollPane patientScrollPane = new PatientScrollPane(locationRelativeToComponent, patientList);

        String patient = patientScrollPane.getCurrentPatient();
        return patient;
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {
        currentPatient = (String)patientList.getSelectedValue();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        int index = patientList.locationToIndex(e.getPoint());
        patientList.setSelectedIndex(index);
        dialog.dispose();
    }

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    public static void main(String[] args) {
        String patient = PatientScrollPane.getPatient();

        System.out.println("Chosen patient: " + patient);
    }
}

(Я пытался искать все выше и ниже для решения аналогичной проблемы, но это слишком общее для поиска.)

Ответы [ 2 ]

4 голосов
/ 17 октября 2011

Пока ваш JFrame существует, поток диспетчеризации событий будет продолжать работать и будет поддерживать JVM активным, поскольку JFrame, окно верхнего уровня, инициирует поток, не являющийся демоном.

Подробнее об этом см. здесь .

А например, ...

import javax.swing.JDialog;
import javax.swing.JFrame;

public class DialogAndDaemons {
   public static void main(String[] args) {
      JFrame frame = new JFrame();

      JDialog dialog = new JDialog(frame, "Dialog");
      dialog.pack();
      dialog.setLocationRelativeTo(null);
      dialog.setVisible(true);
   }
}
3 голосов
/ 17 октября 2011

После dialog.dispose(); используйте System.exit(0);

...