Я публикую полный код ниже, но в основном у меня есть класс, в котором есть диалог, содержащий полосу прокрутки, которая содержит 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);
}
}
(Я пытался искать все выше и ниже для решения аналогичной проблемы, но это слишком общее для поиска.)