Обновите JList новыми входными данными

По сути, мой проект заключается в создании простой библиотечной системы, в которой любой пользователь может иметь до трех книг одновременно. Я делаю это с помощью BreezySwing (потому что мне это нужно) и использую JList для вывода списка вынутых книг.

Чтобы вернуть книгу, пользователь щелкает книгу для возврата в списке и нажимает кнопку «Вернуть». Однако я не могу понять, как заставить JList работать правильно.

Как добавить новую информацию в список?

Вот код, который у меня есть до сих пор:

import java.util.*;
import javax.swing.*;
import BreezySwing.*;

public class ClientGUI extends GBFrame {
    private JButton returnBook, takeOutBook;
    private JLabel title, author;
    private JTextField titleInput, authorInput;
    private int bookCount = 0;
    DefaultListModel books = new DefaultListModel();
    private JList booksOut = new JList(books);

    public ClientGUI(){
        title = addLabel("Title: ",1,1,1,1);
        author = addLabel("Author: ",2,1,1,1);
        titleInput = addTextField("",1,2,2,1);
        authorInput = addTextField("",2,2,2,1);
        returnBook = addButton("Return",3,1,1,1);
        takeOutBook = addButton("Take Out",3,2,1,1);
        booksOut = addList(4,1,2,1);
        returnBook.setEnabled(false);
        books.addElement("Book - Author");
    }

    public void buttonClicked(JButton buttonObj){
        if(buttonObj == takeOutBook){
            if(bookCount < 3){
                String titleAdd = titleInput.getText();
                String authorAdd = authorInput.getText();
                books.addElement(titleAdd + "By: " + authorAdd);
                bookCount++;

                if(bookCount == 0){
                    takeOutBook.setEnabled(true);
                    returnBook.setEnabled(false);
                } else if(bookCount == 3){
                    takeOutBook.setEnabled(false);
                    returnBook.setEnabled(true);
                } else {
                    takeOutBook.setEnabled(true);
                    returnBook.setEnabled(true);
                }
            } else if(bookCount == 3){
                JOptionPane.showMessageDialog(null, "Please return a book first", "Invalid Choice", JOptionPane.INFORMATION_MESSAGE);
            }
        } else if(buttonObj == returnBook){
            //int n = (Integer) books.getSelectedValue();
            //books.remove(n);
            bookCount--;
            if(bookCount == 0){
                takeOutBook.setEnabled(true);
                returnBook.setEnabled(false);
            } else if(bookCount == 3){
                takeOutBook.setEnabled(false);
                returnBook.setEnabled(true);
            } else {
                takeOutBook.setEnabled(true);
                returnBook.setEnabled(true);
            }
        }
    }

    public static void main(String args[]){
        ClientGUI GUI = new ClientGUI();
        GUI.setSize(300,275);
        GUI.setTitle("Library");
        GUI.setVisible(true);
     }
}

По сути, мне нужно, чтобы JList работал правильно. Остальное могу закончить. Спасибо.


person user1340073    schedule 02.09.2012    source источник
comment
сделать это с помощью BreezySwing Единственный способ убедиться, что это не вина этого API, — это подготовить SSCCE с чистым J2SE.   -  person Andrew Thompson    schedule 02.09.2012


Ответы (2)


Попробуйте DefaultListModel.addElement

Он будет запускать события обновления для списка, чтобы ответить на

ОБНОВЛЕНИЕ

Не зная, как работает BreezySwing, я бы сосредоточился на этой линии...

booksOut = addList(4, 1, 2, 1);

Учитывая то, что, как я считаю, делают другие строки в коде, это, казалось бы, «создает» новый Jlist и возвращает его (применяя макет).

Это означает, что модель, которую использовал booksOut, больше не является моделью books.

Попробуйте добавить

booksOut.setModel(books);

После строки addList и посмотрите, поможет ли это

person MadProgrammer    schedule 02.09.2012
comment
@AndrewThompson Да, подхватил это после того, как я опубликовал (5 месяцев извиваний в твоих руках, а на iPad не годится для хорошего поста: P) - person MadProgrammer; 02.09.2012
comment
Может быть, тебе следует позволить юношам печатать. Эти маленькие пальцы хорошо подходят для размера экрана планшета (в меньшей степени слюни). Счастливых всем заморочек. :) - person Andrew Thompson; 02.09.2012
comment
@AndrewThompson Она уже знает, как им пользоваться, лучше меня: P - person MadProgrammer; 02.09.2012

Вот «нулевой результат», с которым вы можете работать, пока он не сломается.

Расширяемый список

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExpandableList {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                final JPanel gui = new JPanel(new BorderLayout());

                String[] listValues = {
                        "Click", "To", "Add", "New", "Values"
                };
                final DefaultListModel model = new DefaultListModel();
                for (String s : listValues) {
                    model.addElement(s);
                }
                JList list = new JList(model);
                MouseListener addListener = new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent me) {
                        String s = JOptionPane.showInputDialog(
                                gui, "New text..");
                        if (s!=null) {
                            model.addElement(s);
                        }
                    }
                };
                list.addMouseListener(addListener);
                gui.add(new JScrollPane(list));

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}
person Andrew Thompson    schedule 02.09.2012