我将列表项添加到JList
numbersList.add("first example");
numbersList.add("second example");
numbersList.add("third example");
当我向字段添加新文本或数字时,它将被添加到列表中并显示在JList中。这里是我的代码,我只想在按下按钮时使用新元素出现在列表fullList
的JList numberList
中,该列表已从textfield numberTxtFld
添加。
p.s我删除了一些不必要的代码。
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);
}
}
答案 0 :(得分:1)
执行此操作时:
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和数据同步的同时执行列表中的任何操作。您可以在the answer to this question中找到一个简单的实现,而不是在此处重新发布代码。
希望有所帮助。
答案 1 :(得分:1)
您需要创建一个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);
然后你应该按照自己的意愿获得所有工作,并为你处理所有更新事件。