我对我的项目有一个问题,基本上它是一个存储同义词的小应用程序。 我有两个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字符串,抛出异常。我不明白为什么,在列表中添加元素也会触发列表选择。 有什么建议吗?
答案 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);
}
}