繁体   English   中英

Java JList和列表问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM