[英]Swing - Exception when trying to delete an item from a JList
我已经找到了解决该问题的方法,但是只有在使用多个对象时,才会发生这种情况,例如,我尝试使用一个对象和两个String变量,但是没有任何异常,所以idk的确是什么错误以及为什么在尝试从Jlist中删除元素时说值是null。 主要代码是
package presentacion;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import dominio.Appointment;
import dominio.Patient;
import dominio.Specialist;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
public class Test {
private JFrame a;
private JTabbedPane tabbedPane;
private JMenuBar menuBar;
private JLabel testlabel;
private Appointment citaSara = new Appointment("09:21");
private Appointment citaPaula = new Appointment("10:32");
private Appointment citaRaul = new Appointment("13:12");
private Patient raul = new Patient ("Raul", "Garcia Jimenez", "926781091", "13120", "Porzuna", "Ciudad Real", "Almendros", "3", "630956066", "raul@gmail.com", "18", "Hombre", citaRaul);
private Patient paula = new Patient ("Paula", "Baos Ramiza", "900124392", "13003", "Robledo", "Ciudad Real", "La plaza", "20", "633727281", "paula@hotmail.com", "23", "Mujer", citaPaula);
private Patient sara = new Patient ("Sara", "Jimenez Dorado", "911232292", "13009", "Ciudad Real", "Ciudad Real", "Ceunca", "4", "611627481", "sara@gmail.com", "32", "Mujer", citaSara);
public Test() {
initialize();
a.setVisible(true);
}
public static void main(String[] args) {
try {
// Set System L&F
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch (UnsupportedLookAndFeelException e) {
// handle exception
}
catch (ClassNotFoundException e) {
// handle exception
}
catch (InstantiationException e) {
// handle exception
}
catch (IllegalAccessException e) {
// handle exception
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.a.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private void initialize() {
a = new JFrame();
a.setTitle("Administraci\u00F3n Hospital");
a.setBounds(100, 100, 1195, 710);
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
a.getContentPane().add(panel, BorderLayout.CENTER);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[]{194, 0, 50, 0};
gbl_panel.rowHeights = new int[]{1, 0, 0};
gbl_panel.columnWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_panel.rowWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
panel.setLayout(gbl_panel);
DefaultListModel<String> modelPacientes = new DefaultListModel<>();
JList <String> list = new JList<>( modelPacientes );
GridBagConstraints gbc_list = new GridBagConstraints();
gbc_list.insets = new Insets(0, 0, 5, 5);
gbc_list.fill = GridBagConstraints.BOTH;
gbc_list.gridx = 0;
gbc_list.gridy = 0;
panel.add(list, gbc_list);
modelPacientes.addElement(raul.getName());
modelPacientes.addElement(paula.getName());
modelPacientes.addElement(sara.getName());
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
setPacientesInfo(list.getSelectedValue());
}
});
JButton btnDelete = new JButton("DELETE");
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultListModel model = (DefaultListModel) list.getModel();
int selectedIndex = list.getSelectedIndex();
int borrar = JOptionPane.showConfirmDialog(null, "Si borra a este paciente no se podrá recuperar, ¿continuar?", "Borrar",
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (borrar == JOptionPane.YES_OPTION && list.getSelectedIndex() != -1) {
model.remove(selectedIndex);
}
}
});
GridBagConstraints gbc_btnDelete = new GridBagConstraints();
gbc_btnDelete.insets = new Insets(0, 0, 5, 5);
gbc_btnDelete.gridx = 1;
gbc_btnDelete.gridy = 0;
panel.add(btnDelete, gbc_btnDelete);
testlabel = new JLabel("");
GridBagConstraints gbc_testlabel = new GridBagConstraints();
gbc_testlabel.insets = new Insets(0, 0, 5, 0);
gbc_testlabel.gridx = 2;
gbc_testlabel.gridy = 0;
panel.add(testlabel, gbc_testlabel);
}
private void setPacientesInfo(String value){
testlabel.setVisible(true);
if (value.indexOf("Sara") != -1){
testlabel.setText(sara.getName());
} else if (value.indexOf("Paula") != -1){
testlabel.setText(paula.getName());
} else if (value.indexOf("Raul") != -1){
testlabel.setText(raul.getName());
}
}
}
Patient和pointation类的代码为:
package dominio;
public class Appointment {
private String time;
public Appointment(String time) {
this.time = time;
}
}
和
package dominio;
public class Patient extends Person{
private String age;
private String genre;
private String mobilePhone;
private String email;
private Appointment appointment;
public Patient(String name, String surname, String phoneNumber, String zipCode, String town, String province,
String street, String houseNumber, String mobilePhone, String email, String age, String genre, Appointment appointment) {
super(name, surname, phoneNumber, zipCode, town, province, street, houseNumber);
this.age = age;
this.genre = genre;
this.mobilePhone = mobilePhone;
this.email = email;
this.appointment = appointment;
}
}
与父母班
package dominio;
public class Person {
private String name;
private String surname;
private String phoneNumber;
private String zipCode;
private String town;
private String province;
private String street;
private String houseNumber;
public Person(String name, String surname, String phoneNumber, String zipCode, String town, String province, String street, String houseNumber){
this.name = name;
this.surname = surname;
this.phoneNumber = phoneNumber;
this.zipCode = zipCode;
this.town = town;
this.province = province;
this.street = street;
this.houseNumber = houseNumber;
}
public String getName() {
return name;
}
}
我为什么要得到这个例外? 我该如何解决? 如果不使用对象,它会完美工作。
编辑。 添加了我放弃的例外代码。
和异常代码:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at presentacion.Test.setPacientesInfo(Test.java:162)
at presentacion.Test.access$1(Test.java:159)
at presentacion.Test$2.valueChanged(Test.java:122)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.removeIndexInterval(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(Unknown Source)
at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source)
at javax.swing.DefaultListModel.remove(Unknown Source)
at presentacion.Test$3.actionPerformed(Test.java:139)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
谢谢
解决问题的最简单方法是在setPacientesInfo(...)
添加一个null
检查。 例如
private void setPacientesInfo(String value){
testlabel.setVisible(true);
if(value != null) {
if (value.indexOf("Sara") != -1){
testlabel.setText(sara.getName());
} else if (value.indexOf("Paula") != -1){
testlabel.setText(paula.getName());
} else if (value.indexOf("Raul") != -1){
testlabel.setText(raul.getName());
}
} else
testlabel.setText("");
}
说明
您需要执行此操作的原因是,当从JList
删除值时, JList
模型中的值已更改,并且您不再选择任何内容。 这意味着value的value
将为null
因为您什么也不选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.