2011-06-21 73 views
0

我的項目中存在一個問題,基本上它是一個存儲同義詞的小應用程序。 我有2個JPanels填充了兩個JLists,一個用於單詞列表,另一個用通訊詞同義詞。 當您單擊某個JList上的單詞時,通訊員同義詞出現在另一個JList 上,則有2個JTextField用於添加一個單詞同義詞對,在一個字段中您插入同義詞的另一個字段中split他們創造與synonyms.split(」「)的數組和所有存儲在地圖 這是我加入到word中的JList更新JList時出現問題

woordenList.addListSelectionListener(new ListSelectionListener() { 

       public void valueChanged(ListSelectionEvent evt) { 

       if (evt.getValueIsAdjusting()){ 

        return; 
       } 

       getSynoniemen(evt); 
      } 
      }); 

的ListSelectionListener這是獲取同義詞的方法

private void getSynoniemen(ListSelectionEvent e){ 

    if(e.getValueIsAdjusting()){ 


     return; 

    }else{ 


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

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

     synoniemenList.setListData(synArray); 

    } 

} 

如果我添加一個詞和同義詞到列表中時,沒有項目是s選擇它工作正常,如果我做這個操作添加項目,而我有一個單詞選擇在單詞-JList,方法getValues()與空字符串被調用,拋出異常。我不明白爲什麼,在列表中添加元素也會觸發列表選擇。 有什麼建議嗎?

+0

'e.getValueIsAdjusting()''中getSynoniemen(...)'是冗餘的。 – mre

+0

我也推薦閱讀[如何使用列表](http://download.oracle.com/javase/tutorial/uiswing/components/list.html),也許這會給你一些見解。從您發佈的代碼片段中,很難評估這裏的真正潛在問題。 – mre

回答

1

我不明白爲什麼,在列表中添加一個元素也會激發列表選擇。

在代碼中的某處,您必須更改選定的索引。

下載並測試How to Use Lists的ListDemo示例。當你運行代碼和「僱用」一個人時,然後列表選擇事件觸發(我向監聽器添加了一個System.out.println(...))。然後如果你評論:

//   list.setSelectedIndex(index); 

該事件未被解僱。所以你的代碼有問題。將您的代碼與工作示例代碼進行比較,以查看不同之處。

如果您需要更多幫助,請發佈SSCCE來證明問題。

+0

Thx的建議,問題是,當我添加一個項目的JList的模型,同時選擇一個項目的同一個jlist時,他會自動調用valueChanged()> getSynoniemen(evt)>它試圖創建字符串woord 「因爲你可以從上面看到的方法」通過調用getSelectedValue(-1)這裏來的NullPointerException,因爲getSelectedValue()調用負int,我沒有得到這個,因爲在那一刻有一個項目選擇在JList所以這個值應該是0或者正值,並且當沒有選擇任何值的時候,所有的方法都不會被調用 – JBoy

+0

@JBoy,問題是你的代碼是錯誤的。我向你提供了一個沒有這個問題的實例。我無法猜測您的代碼與工作示例的不同之處,因此如果沒有您自己的SSCCE,就不會這麼做。 – camickr

+0

嗨,我知道你是對的,很難有一個想法沒有正確的代碼,我做了我的項目與內部類的一個非常小的版本,我已經省去了所有的冗餘代碼,它在上面 – JBoy

1

我會推薦使用DefaultListModel來操縱JList的內容。

+0

Thx的提示,但仍然是相同的問題 – JBoy

+0

很好的建議,但這是如何回答? – mre

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); 

} 

}

+0

你在哪裏要求比較代碼適用於您的代碼。所以當你點擊工作示例中的「Hire」按鈕時,人員姓名如何被添加到列表中?現在當你點擊你的「保存」按鈕時,你的代碼是做什麼的?有什麼不同? – camickr