Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > ошибка при удалении элемента из JList


Автор: Entwickler 15.9.2008, 22:36
Привет!!!
Есть маленькая проблемка... при удалении элемента из JLista происходит ошибка... что то с JLabel не в норме... если в 
Код

public void valueChanged(ListSelectionEvent e) {

прокоментировать строчку:
Код

myCityLabel.setText(myJList.getSelectedValue().toString()+"");

то всё работает прекрассно!!!
вот весь код:
Код

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

public class MyJList extends JPanel {

    private JList myJList = null;
    private DefaultListModel myModel = null;
    private JTextField cityName = null;
    private JButton addCity = null;
    private JButton deleteCity = null;
    private JSplitPane splitPane = null;
    private JPanel myButtonPanel = null;
    private JLabel myCityLabel = null;
    private JScrollPane scrollPane = null;

    public MyJList() {
        super(new BorderLayout());

        myModel = new DefaultListModel();
        myModel.addElement("Рудный");
        
        myJList = new JList(myModel);
        myJList.setVisibleRowCount(5);
        myJList.addListSelectionListener(new JListListener());
        
        scrollPane = new JScrollPane(myJList);

        myButtonPanel = new JPanel(new GridLayout());

        cityName = new JTextField();
        addCity = new JButton("Добавить город");
        addCity.addActionListener(new AddButtonListener());
        deleteCity = new JButton("Удалить город");
        deleteCity.addActionListener(new DeleteButtonListener());
        
        myButtonPanel.add(cityName);
        myButtonPanel.add(addCity);
        myButtonPanel.add(deleteCity);
        
        myCityLabel = new JLabel();
        myCityLabel.setOpaque(true);
        
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,scrollPane,myCityLabel);
        splitPane.setOneTouchExpandable(true);
        splitPane.setDividerLocation(150);
        
        add(myButtonPanel,BorderLayout.PAGE_START);
        add(splitPane, BorderLayout.CENTER);
        
    }

    class JListListener implements ListSelectionListener {

        public void valueChanged(ListSelectionEvent e) {
            int index = myJList.getSelectedIndex();
            myCityLabel.setText(myJList.getSelectedValue().toString()+"");
        }
    }

    class AddButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            myModel.addElement(cityName.getText().toString());
            cityName.setText("");
        }
    }

    class DeleteButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            myCityLabel.setText("");
            int index = myJList.getSelectedIndex();
            myModel.remove(index);
        }
    }
}

а вот код главного класса:
Код

import javax.swing.*;

public class MyMainClass {

    public static void main(String[] args) {
        
        JFrame frame = new JFrame("Тренировка");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JComponent myComponent = new MyJList();
        myComponent.setOpaque(true);
        frame.setContentPane(myComponent);
        
        frame.pack();
        frame.setVisible(true);
    }
}

Автор: SaSho 16.9.2008, 08:34
Судя по всему, там не в JLabel не впорядке, а при удалении элемента возникает NPE, т.к. myJList.getSelectedValue() возвращает null.
Попробуй изменить:
Код

            int index = myJList.getSelectedIndex();
            myCityLabel.setText(myJList.getSelectedValue().toString()+"");

на 
Код

          if (!myJList.isSelectionEmpty())
            myCityLabel.setText(myJList.getSelectedValue().toString()+"");


А ещё здесь будет возникать ошибка:
Код

    class DeleteButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            myCityLabel.setText("");
            int index = myJList.getSelectedIndex();
            myModel.remove(index);
        }

Следует совершить проверку:
Код

            int index = myJList.getSelectedIndex();
            if (index > -1 )
               myModel.remove(index);


Автор: Entwickler 16.9.2008, 09:58
хм...заработало... smile огромное спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)