Показать члены объекта внутри JScrollPane

У меня есть список объектов, использующих модель списка по умолчанию, например:

public static DefaultListModel<Loan> loans = new DefaultListModel<Loan>();

Мое приложение Swing выглядит так:

Изображение моего приложения Swing

При нажатии кнопки «Добавить» создается объект Loan и добавляется этот объект в DefaultListModel, например:

addLoan.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Loan loan = Calculator.createLoan(
                Double.parseDouble(loanAmount.getText()),
                Double.parseDouble(interestRate.getText()),
                Double.parseDouble(term.getText())
        );

        Calculator.addALoan(loan); 
    }
});

Теперь с моим кодом объекты действительно появляются в JScrollPane штрафе. Вы можете увидеть ниже:

JList loanList = new JList(Calculator.loans);
loans = new javax.swing.JScrollPane(loanList);

Приведенный выше код происходит в моем методе init. Вот что я вижу на фронтенде:

введите здесь описание изображения

Я хочу выделить его и показать каждого из участников внутри этого поля (панель прокрутки). Объект кредита состоит из суммы, процентной ставки и срока. Я пробовал что-то похожее на (Как добавить объект в JList и показать член объекта в интерфейсе списка для пользователя?), но я не понимаю, как показывает средство визуализации в принятом ответе вверх.


person madmaxx01    schedule 22.07.2021    source источник
comment
Средство визуализации по умолчанию для JList просто вызывает метод toString() объекта в файле ListModel. Когда у вас есть несколько столбцов данных, вы должны использовать JTable. Дополнительную информацию см. в руководстве по Swing на странице Как использовать таблицы. . Если вы хотите сохранить объект Loan в своем TableModel, вы можете создать собственный файл TableModel. См.: Модель таблицы строк для пошагового -шаг пример того, как это можно сделать.   -  person camickr    schedule 22.07.2021
comment
(1-) Примечание: более двух недель назад вам дали приведенный выше совет: stackoverflow.com/questions/68263118/.   -  person camickr    schedule 22.07.2021
comment
@camickr Извинения, я не заметил, что я спрашивал об этом раньше. Я не получил достаточного ответа, несмотря ни на что.   -  person madmaxx01    schedule 22.07.2021


Ответы (1)


Вы видите результат поведения Swing по умолчанию. Swing вызывает toString() для каждого объекта Loan.

Вы можете переопределить этот метод, чтобы вернуть что-то подходящее для отображения:

public class Loan {
    // (property methods)

    @Override
    public String toString() {
        return String.format("%12s    %6s    %,.1f years",
            NumberFormat.getCurrencyInstance().format(
                getAmount()),
            NumberFormat.getPercentInstance().format(
                getInterestRate() / 100),
            getTerm());
    }
}

Поскольку JList использует шрифт пропорциональной ширины на большинстве платформ, значения из кредитных объектов, вероятно, не будут совпадать друг с другом. Чтобы решить эту проблему, удалите свой JList, удалите свою модель списка и вместо этого создайте подкласс AbstractTableModel и используйте JTable, как предложил camickr.

person VGR    schedule 22.07.2021
comment
Я просто упомяну, что вы можете использовать моноширинный шрифт в JList. Однако я согласен со всеми, что JTable и TableModel являются правильным выбором для кода в вопросе. - person Gilbert Le Blanc; 22.07.2021