[英]Java JList and list problems
我將列表項添加到JList
numbersList.add("first example");
numbersList.add("second example");
numbersList.add("third example");
當我向字段添加新文本或數字時,它將被添加到列表中並在JList中顯示。 在這里我的代碼,我只是想,當我按下按鈕,新的元素出現在JList的fullList
從列表numberList
已經從文本框添加numberTxtFld
。
ps我刪除了一些不必要的代碼。
package average;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
public class Surface extends JLabel{
private JTextField numberTxtFld;
private JLabel topLabel;
private JLabel sumLabel;
private JLabel avgLabel;
private JLabel maxLabel;
private JLabel minLabel;
private JLabel amountLabel;
private JLabel listLabel;
private JLabel resultLabel;
private JLabel sumAnswerFld;
private JLabel avgAnswerFld;
private JLabel maxAnswerFld;
private JLabel minAnswerFld;
private JLabel amountAnswerFld;
private JLabel fullListLabel;
private JList fullList;
final List<String> numbersList = new ArrayList<String>();
private JButton submitBtn;
private JButton closeBtn;
private JPanel panel;
private int arrayIndex = 0;// used for components adding into array
public Surface(){
panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setSize(300, 300);
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
topLabel = new JLabel("Enter your number and push submit");
gbc.gridwidth = 3;
gbc.gridx = 0; // column
gbc.gridy = 0; // row
panel.add(topLabel, gbc);
gbc.gridwidth = 1; // setting grid column with to default
fullListLabel = new JLabel("Full list");
gbc.gridx = 2;
gbc.gridy = 1;
panel.add(fullListLabel, gbc);
amountLabel = new JLabel("Amount");
gbc.gridx = 0;
gbc.gridy = 5;
panel.add(amountLabel, gbc);
amountAnswerFld = new JLabel("0");
gbc.gridx = 1;
gbc.gridy = 5;
panel.add(amountAnswerFld, gbc);
numberTxtFld = new JTextField();
numberTxtFld.setColumns(10);
gbc.gridx = 0;
gbc.gridy = 1;
panel.add(numberTxtFld, gbc);
submitBtn = new JButton("Submit");
gbc.gridx = 1;
gbc.gridy = 1;
submitBtn.addActionListener(
new ActionListener(){
@Override
public void actionPerformed(ActionEvent event) {
String text = numberTxtFld.getText();
numbersList.add(text);
}
}
);
panel.add(submitBtn, gbc);
numbersList.add("first example");
numbersList.add("second example");
numbersList.add("third example");
fullList = new JList(numbersList.toArray());
fullList.setVisibleRowCount(6);
fullList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
gbc.gridheight = 6;
gbc.gridx = 2;
gbc.gridy = 2;
panel.add(new JScrollPane(fullList), gbc);
gbc.gridheight = 1; // setting grid column with to default
add(panel);
}
}
當你這樣做:
fullList = new JList(numbersList.toArray());
你沒有神奇地將JList附加到numbersList,你只是在那個時候使用numbersList的內容填充JList,當然,這不包括按下按鈕后添加的任何項目。
您至少有三個選擇:
最基本的解決方案是在submitBtn動作偵聽器中向fullList顯式添加新項。 你有很多選擇。 您只需從submitBtn將新項添加到fullList即可,這很簡單,可能適用於您的應用程序。 為此,請確保列表的模型是DefaultListModel ,然后您可以使用((DefaultListModel) getModel() )。 addElement()添加項目。
DefaultListModel model = new DefaultListModel();
fullList.setModel(model);
// to add an element (during initial population, and action listener):
model.addElement("the element");
更強大的解決方案是根據numbersList的當前內容完全重新填充fullList,並從您的動作偵聽器執行此操作,以將GUI重新同步到數據。 由於其他原因,這可能是不可取的,例如,由於它對當前項目選擇等的影響,首先清除列表可能是不可接受的。取決於您的要求。 您可以使用JList的setListData() 。
// any time you want to repopulate the list:
fullList.setListData(numbersList.toArray());
但請記住,這會將列表模型設置為只讀模型,稍后您將無法使用getModel()。addElement()。
更加健壯且通常優選的解決方案是實現反映numbersList內容的ListModel並將該ListModel分配給您的JList。 這可以生成非常干凈的代碼,使您可以在保持GUI和數據同步的同時執行列表中的任何操作。 您可以在此問題的答案中找到一個簡單的實現,而不是在此處重新發布代碼。
希望有所幫助。
您需要創建一個ListModel。 正如您所做的那樣非常簡單,您可以使用DefaultListModel。
你需要申報
private DefaultListModel defaultListModel;
並實例化它
defaultListModel = new DefaultListModel();
然后將它附加到JLists構造函數中的JList
fullList = new JList(defaultListModel);
然后,您需要將項目添加到defaultListModel,可能是在循環中
for (Object o : numbersList) {
defaultListModel.addElement(o);
}
最后,在您的動作偵聽器中,您現在需要在defaultListModel上調用addElement方法
String text = numberTxtFld.getText();
defaultListModel.add(text);
然后,您應該按照自己的意願獲得所有工作,並為您處理所有更新事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.