簡體   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