Как мне обновить JList и сохранить его в массиве с помощью функции? - PullRequest
0 голосов
/ 27 мая 2020

У меня сложилось впечатление, что большая часть моего кода работает, однако я думаю, что уверен, что мне не хватает только одной строки под функцией updatedJList() Пожалуйста, помогите, спасибо.

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.JList;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Ex1 extends JFrame {

    private JTextField txtName;
    private JList nameList;
    private String[] nameArr;
    private int arrCounter = 0;
    private JLabel lblDisplayName;

    public Ex1(){

        this.setTitle("Exercise01");
        this.setSize(300, 266);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        this.nameArr = new String[10];
        JLabel lblName = new JLabel("Name:");
        lblName.setBounds(10, 11, 264, 14);
        getContentPane().add(lblName);

        this.txtName = new JTextField();
        this.txtName.setBounds(10, 25, 264, 20);
        getContentPane().add(this.txtName);
        this.txtName.setColumns(10);

        JButton btnAddName = new JButton("Add Name to List");
        btnAddName.setBounds(10, 49, 264, 23);
        getContentPane().add(btnAddName);
        btnAddName.addActionListener(new AddNameListener());

        //Create ScrollPane

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 75, 264, 126);
        getContentPane().add(scrollPane);

       //Create and Add JList

        this.nameList = new JList();
        nameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.updateJList();

        this.nameList.addListSelectionListener(new DisplayListener());
        this.lblDisplayName = new JLabel("(Name will be shown here)");
        this.lblDisplayName.setHorizontalAlignment(SwingConstants.CENTER);
        this.lblDisplayName.setBounds(10, 203, 264, 14);
        getContentPane().add(this.lblDisplayName);

        this.setVisible(true);
}

    private class AddNameListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {

        updateJList();

    }
}

    private void updateJList(){
        //I think I am missing something on this line.. HELP
        String name = this.txtName.getText();
        this.txtName.setText(name);
        this.arrCounter++;
        this.txtName.setText("");
        DefaultListModel model = new DefaultListModel();
        for(int i =0;i<this.nameArr.length;i++)
        {
            model.addElement(name);
        }
        this.nameList.setModel(model);
    }
    private class DisplayListener implements ListSelectionListener {
    @Override
    public void valueChanged(ListSelectionEvent arg0) {
    displayName();
    }
    }
    private void displayName()
    {
    int index = this.nameList.getSelectedIndex();
    String name = this.nameArr[index];
    this.lblDisplayName.setText(name);
    }
    public static void main(String[] args) {
    Ex1 gui = new Ex1();
    }
    }

Я очень-очень-очень заблудился, я не могу понять, что не так, я изучаю Java уже около 8 недель, и я также работал над этим вопросом 4 часа. Я действительно думаю, что пропустил строку, но если вы думаете иначе, не стесняйтесь комментировать. Спасибо, замечательные люди!

Изменить: После некоторого обсуждения проблема, о которой заявляет OP, следующая:

Каждый раз, когда я запускаю код, он будет работать, однако, когда я ввожу имя в текстовое поле, чтобы сохранить его в массиве и отобразить, оно не будет отображаться в текстовом поле, поэтому я не могу отобразить имя.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Сравните приведенный ниже код с кодом в вашем вопросе. Изменения описаны после кода.

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.JList;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Ex1 extends JFrame {

    private JTextField txtName;
    private JList<Object> nameList;
    private String[] nameArr;
    private int arrCounter = 0;
    private JLabel lblDisplayName;

    public Ex1() {

        this.setTitle("Exercise01");
        this.setSize(300, 266);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        this.nameArr = new String[10];
        JLabel lblName = new JLabel("Name:");
        lblName.setBounds(10, 11, 264, 14);
        getContentPane().add(lblName);

        this.txtName = new JTextField();
        this.txtName.setBounds(10, 25, 264, 20);
        getContentPane().add(this.txtName);
        this.txtName.setColumns(10);

        JButton btnAddName = new JButton("Add Name to List");
        btnAddName.setBounds(10, 49, 264, 23);
        getContentPane().add(btnAddName);
        btnAddName.addActionListener(new AddNameListener());

        // Create and Add JList

        DefaultListModel<Object> model = new DefaultListModel<>();
        this.nameList = new JList<>(model);
        nameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        // Create ScrollPane

        JScrollPane scrollPane = new JScrollPane(nameList);
        scrollPane.setBounds(10, 75, 264, 126);
        getContentPane().add(scrollPane);

        this.nameList.addListSelectionListener(new DisplayListener());
        this.lblDisplayName = new JLabel("(Name will be shown here)");
        this.lblDisplayName.setHorizontalAlignment(SwingConstants.CENTER);
        this.lblDisplayName.setBounds(10, 203, 264, 14);
        getContentPane().add(this.lblDisplayName);

        this.setVisible(true);
    }

    private class AddNameListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            updateJList();
        }
    }

    private void updateJList() {
        // I think I am missing something on this line.. HELP
        String name = this.txtName.getText();
        this.txtName.setText(name);
        this.arrCounter++;
        this.txtName.setText("");
        DefaultListModel<Object> model = (DefaultListModel<Object>) nameList.getModel();
        model.addElement(name);
    }

    private class DisplayListener implements ListSelectionListener {
        @Override
        public void valueChanged(ListSelectionEvent arg0) {
            displayName();
        }
    }

    private void displayName() {
        int index = this.nameList.getSelectedIndex();
        if (index >= 0) {
            ListModel<Object> model = nameList.getModel();
            Object obj = model.getElementAt(index);
            String name = obj == null ? "" : obj.toString();
            this.lblDisplayName.setText(name);
        }
    }

    public static void main(String[] args) {
        Ex1 gui = new Ex1();
    }
}

Сначала создайте модель для JList и передайте ее конструктору JList.

DefaultListModel<Object> model = new DefaultListModel<>();
this.nameList = new JList<>(model);

Вы добавляете пустой JScrollPane. Вам нужно передать JList конструктору JScrollPane.

JScrollPane scrollPane = new JScrollPane(nameList);

В методе updateJList() вам не нужна новая модель, вам просто нужно обновить существующую модель, добавив

DefaultListModel<Object> model = (DefaultListModel<Object>) nameList.getModel();
model.addElement(name);

EDIT

Извините, я не обратил внимания на ту часть вашего кода, которая отображает выбранное значение из nameList.

Я изменил метод displayName() в приведенном выше коде на следующий:

private void displayName() {
    int index = this.nameList.getSelectedIndex();
    if (index >= 0) {
        ListModel<Object> model = nameList.getModel();
        Object obj = model.getElementAt(index);
        String name = obj == null ? "" : obj.toString();
        this.lblDisplayName.setText(name);
    }
}

Вам не нужно nameArr и arrCounter.

0 голосов
/ 27 мая 2020

В массиве нет необходимости.

Когда вы используете компоненты Swing, данные хранятся в «модели», в данном случае DefaultListModel. Таким образом, данные добавляются в модель, и если каждый из вас хочет получить доступ к данным в JList, вы получаете данные из модели.

DefaultListModel model = new DefaultListModel();

Этот код неверен. Вы же не хотите создавать новую модель каждый раз, когда нажимаете кнопку. Вы хотите добавить элементы к существующей модели, чтобы можно было отобразить все элементы.

Прочтите раздел из учебника Swing на Как использовать списки . Код ListDemo покажет вам, как лучше структурировать ваш класс, чтобы вы могли динамически добавлять и удалять элементы в модели. Так что скачайте код и измените его в соответствии со своими требованиями.

...