更新JList时出现问题

时间:2011-06-21 13:37:07

标签: java swing event-handling jlist

我对我的项目有一个问题,基本上它是一个存储同义词的小应用程序。 我有两个JPLnels,其中包含两个JList,一个用于单词列表,另一个用于对应的同义词。 当您单击一个JList上的单词时,对应的同义词将出现在另一个JList上 然后有2个JTextFields,用于添加单词 - 同义词对,在一个字段中插入单词,在另一个字段中插入同义词,拆分它们创建一个包含synonyms.split(“”)的数组并将所有内容存储在Map中 这是我添加到单词JList

的ListSelectionListener
    woordenList.addListSelectionListener(new ListSelectionListener() {

              public void valueChanged(ListSelectionEvent evt) {

                if (evt.getValueIsAdjusting()){

                  return;
                }

                getSynoniemen(evt);
             }
            });

这是获取同义词的方法

    private void getSynoniemen(ListSelectionEvent e){

    if(e.getValueIsAdjusting()){


        return;

     }else{


         String woord=(String)woordenList.getSelectedValue();

         Object[] synArray=(Object[])beheer.getValues(woord);

         synoniemenList.setListData(synArray);

     }

}

如果我在没有选择任何项目时在列表中添加单词和同义词,它可以正常工作,如果我执行添加项目的操作,而我在word-JList中选择了一个单词,方法getValues()with调用null字符串,抛出异常。我不明白为什么,在列表中添加元素也会触发列表选择。 有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我建议使用DefaultListModel来操作JList的内容。

答案 1 :(得分:1)

  

我不明白为什么,在列表中添加元素也会触发列表选择。

您的代码中的某处必须更改所选索引。

下载并测试How to Use Lists的ListDemo示例。当您运行代码并“雇用”一个人时,列表选择事件将触发(我向侦听器添加了一个System.out.println(...))。如果你评论出来:

//            list.setSelectedIndex(index);

事件未被触发。所以你的代码有问题。将您的代码与工作示例代码进行比较,看看有什么不同。

如果您需要更多帮助,请发布展示问题的SSCCE

答案 2 :(得分:0)

这是我项目的SSCCE,我遗漏了所有例外和评论以及不相关的按钮,标签,方法。 尝试插入带有同义词的单词,然后选择一个单词,然后在单词被选中时尝试插入另一对单词 - 同义词,会出现异常 import javax.swing.AbstractListModel; import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.JScrollPane; import java.awt.Rectangle; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener;

公共类Synonims扩展了JFrame {

private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JScrollPane wordsPane = null;
private JScrollPane synosymsPane = null;
private JTextField wordField = null;
private JTextField synonymsField = null;
private JButton addButton = null;
private JList wordsList=new JList(new DefaultListModel());
private JList synonymsList=new JList(new DefaultListModel());
private SynonymsManager manager=new SynonymsManager();

//default const
public Synonims() {
    super();
    initialize();
}
//init
private void initialize() {
    this.setSize(413, 285);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setContentPane(getJContentPane());
    this.setTitle("JFrame");
}

//contentpane
private JPanel getJContentPane() {
    if (jContentPane == null) {
        jContentPane = new JPanel();
        jContentPane.setLayout(null);
        jContentPane.add(getWordsPane(), null);
        jContentPane.add(getSynosymsPane(), null);
        jContentPane.add(getWordField(), null);
        jContentPane.add(getSynonymsField(), null);
        jContentPane.add(getAddButton(), null);
    }
    return jContentPane;
}
//RELEVANT: LISTSELECTIONLISTENER
private JScrollPane getWordsPane() {
    if (wordsPane == null) {
        wordsPane = new JScrollPane();
        wordsPane.setBounds(new Rectangle(16, 15, 121, 177));
        wordsPane.getViewport().add(wordsList,null);
        wordsList.addListSelectionListener(new ListSelectionListener() {

              public void valueChanged(ListSelectionEvent evt) {


                getSyn(evt);
             }
            });
    }
    return wordsPane;
}
//RELEVANT: GET THE SYNONYMS OF THE SELECTED WORD
public void getSyn(ListSelectionEvent e){
    String word=(String)wordsList.getSelectedValue();
    Object[] synArray=(Object[])manager.getValues(word);
    synonymsList.setListData(synArray);
}

//synonymspane
private JScrollPane getSynosymsPane() {
    if (synosymsPane == null) {
        synosymsPane = new JScrollPane();
        synosymsPane.setBounds(new Rectangle(254, 14, 133, 181));
        synosymsPane.getViewport().add(synonymsList,null);
    }
    return synosymsPane;
}

//wordfield
private JTextField getWordField() {
    if (wordField == null) {
        wordField = new JTextField();
        wordField.setBounds(new Rectangle(16, 209, 129, 27));
    }
    return wordField;
}

//synonymsfield
private JTextField getSynonymsField() {
    if (synonymsField == null) {
        synonymsField = new JTextField();
        synonymsField.setBounds(new Rectangle(254, 207, 136, 30));
    }
    return synonymsField;
}

//the button
private JButton getAddButton() {
    if (addButton == null) {
        addButton = new JButton();
        addButton.setBounds(new Rectangle(164, 228, 72, 25));
        addButton.setText("save");
        addButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                addAction(); 
            }
        });
    }
    return addButton;
}
//RELEVANT: THE METHODS THAT LOADS BOTH WORD AND SYNONYMS
public void addAction(){
String newWord=wordField.getText();
String newSynonyms= synonymsField.getText();
String[] synonymsArray=newSynonyms.split(" ");
manager.addSyn(newWord, synonymsArray);
wordField.setText("");
synonymsField.setText("");
wordsList.setListData(manager.getKeys());
}

//INNER CLASS FOR THE SYNONYMS
public class Synonym{

    private String[] synonym=null;

    public Synonym(String[]synonym){
        this.synonym=synonym;
    }

    public String[] getSynonyms(){
        return this.synonym;
    }
}

//INNER CLASS THAT MANAGES THE SYNONYMS
public class SynonymsManager extends AbstractListModel{
    private Map<String,Synonym> manager=null;

    public SynonymsManager(){
        manager=new HashMap<String,Synonym>();
    }

    public void addSyn(String woord, String[] synonyms){
       Synonym syn=new Synonym(synonyms);
         manager.put(woord, syn);
         fireContentsChanged(this,0,getSize() -1);
    }

    public Object getElementAt(int arg0) {
        return null;
    }
    public int getSize() {
        return 0;
    }

    public Object[] getKeys(){

        Set<String>keySet=manager.keySet();
        Object[] keys=keySet.toArray();
        return keys;
    }
    public Object[] getValues(String woord){

        Object[] values=search(woord).getSynonyms();

        return values;
    }
     public Synonym search(String word){

         return manager.get(word);
     }
}

public static void main(String[] args){

    Synonims s=new Synonims();
    s.setVisible(true);

}

}