繁体   English   中英

Swing-尝试从JList删除项目时发生异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM