将元素从JTextField添加到ArrayList

时间:2017-05-11 20:09:15

标签: java swing arraylist jtextfield jtextarea

所以我有一个包含GUI的任务,包含:

  • JTextField,允许用户在文本字段中输入输入
  • AddButton将输入添加到ArrayList
  • ListButtonJTextArea
  • 中显示ArrayList的内容

问题是:当我输入[1,2,3]时,输出只显示最后一个元素[3],如何解决这个问题?

public class Example extends JFrame {
    private final int WINDOW_WIDTH = 300;
    private final int WINDOW_HEIGHT = 300;
    private JPanel panel1, panel2;
    private JLabel messageLabel;
    private JTextField input;
    private JTextArea output;
    private JButton addButton, listButton;
    String userInput;
    ArrayList<String> list = new ArrayList<>();

public Example() {
    setTitle("Array Exercise");
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());

    panel1 = new JPanel();
    panel1.setLayout(new GridLayout(6,1));

    messageLabel = new JLabel("Input");
    input = new JTextField(5);
    addButton = new JButton("Add");
    listButton = new JButton("List");

    panel1.add(messageLabel);
    panel1.add(input);
    panel1.add(addButton);
    panel1.add(listButton);
    add (panel1, BorderLayout.WEST);

    output = new JTextArea(12, 10);
    panel2 = new JPanel();
    panel2.add(output);
    add(panel2, BorderLayout.EAST);


    setVisible(true);
    input.requestFocus();

    ButtonListener bh =  new ButtonListener();

    addButton.addActionListener(bh);
    listButton.addActionListener(bh);      
}   
private class ButtonListener implements ActionListener {     
    @Override
    public void actionPerformed(ActionEvent e) {
        userInput = input.getText();

        if (e.getSource() == addButton) {
            list.add(userInput);
            output.setText(userInput + " added.");
            input.setText("");
            input.requestFocus();
        }

        else if (e.getSource() == listButton) {                
            list.stream().forEach(x-> output.setText(x));
        }
    }
}

2 个答案:

答案 0 :(得分:4)

JTextField将其文本添加到列表中每个元素的新文本​​。你需要做的就是这样:

for(String s : list){
    outPut.append(s + "\n");
} 
//Use "\n" if you want each string on a new line. Otherwise, skip it

(为了清晰起见,我使用了这种类型的for循环)

现在它&#34;添加&#34; (追加)列表中的每个新String。在您的代码中,它将文本设置为第一个String。将文本设置为第二个String(依此类推)。因此,每次要打印出来时,请记住用 setText(&#34;&#34;); 清除该区域,例如,新的字符串列表

答案 1 :(得分:1)

补充奥斯卡的回答:

setTest()设置文本区域的整个文本,覆盖以前的内容。所以最后一个值集是(唯一的)将在最后保存的值。

由于已经使用Streams,您可以使用:

output.setText(list.stream().collect(Collectors.joining("\n")));