Обновить пользовательский контейнер через кнопку внутри него в Java

Доброе утро,

У меня есть класс, который наследуется от java.awt.Container. Его задача заключается в том, чтобы обернуть список файлов, отображая их по вертикали в виде списка "Метки файлов + кнопки удаления".

файлы отображаются правильно, и каждый раз, когда добавляется новый, он обновляется правильно.

Код класса компонента:

public class AttachmentsList extends Container {
private List<File>  attachments = null;

public AttachmentsList(List<File> attachments)
{
    super();
    this.attachments = attachments;
    buildListAttachments();
}

@Override
public void repaint()
{
    buildListAttachments();
    super.repaint();
}

protected void buildListAttachments()
{
    int yTraslation = 0;

    for (File attachment : this.attachments)
    {
        Label fileName = new Label(attachment.getName());
        fileName.setBounds(10, 10 + yTraslation, 70, 20);

        //invisible, just contain the absolute path...
        final Label path = new Label(attachment.getAbsolutePath());
        fileName.setBounds(10, 10 + yTraslation, 70, 20);

        Button deleteFile = new Button("x");
        deleteFile.setBounds(90, 10 + yTraslation, 20, 20);

        deleteFile.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                File fileToRemove = new File(path.getText());
                attachments.remove(fileToRemove);
                System.out.println(attachments.size());
                repaint();//<---- It doesn't refresh the main UI.
            }
        });

        add(fileName);
        add(deleteFile);

        yTraslation += 20;
    }
}

Область действия кнопки - удаление из списка файлов определенного файла, идентифицируемого по его собственному абсолютному пути. Это работает, но я не могу понять, как обновить его интерфейс через основной интерфейс.

Приведенный выше код вызывается в основном классе пользовательского интерфейса:

...
final List<File> filesAttached = new LinkedList<File>();
...
final AttachmentsList attachmentsList = new AttachmentsList(fileAttached);
attachmentsList.setBounds(10, 80, 120, 200);
...
//inside ActionListener
...
//pathChooser is a JFileChooser object
fileAttached.add(pathChooser.getSelectedFile());
//every time that one file is added i have to refresh that component. It refreshes!
attachmentsList.repaint();
...

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

Спасибо! С уважением

Andrea

1 ответ

Решение

Наконец-то нашел решение по предложениям Андрея.

Это мой класс:

public class AttachmentsList extends JPanel
{
private List<File>          attachments = null;

private JTable              jt          = null;
private DefaultTableModel   model       = null;
private JScrollPane         scroller    = null;

public AttachmentsList(List<File> attachments)
{
    super();
    this.attachments = attachments;
    setLayout(new GridLayout());

    Vector<Vector> rowData = new Vector<Vector>();

    for (File iterable_element : this.attachments)
    {
        Vector<Object> row = new Vector<Object>();
        row.addElement(iterable_element.getName());
        row.addElement(new JCheckBox());

        rowData.add(row);
    }

    Vector<String> columnNames = new Vector<String>();
    columnNames.add("File");
    columnNames.add("Selected");

    this.jt = new JTable(rowData, columnNames);
    this.jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    this.model = (DefaultTableModel) this.jt.getModel();

    final TableColumnModel columnModel = this.jt.getColumnModel();

    columnModel.getColumn(0).setPreferredWidth(100);
    columnModel.getColumn(1).setPreferredWidth(60);

    this.scroller = new JScrollPane(this.jt);

    add(this.scroller);
}

@Override
public void repaint()
{
    buildTable();
}

protected void buildTable()
{
    if (this.attachments != null)
    {
        Vector<Vector> rowData = new Vector<Vector>();

        for (File currentFile : this.attachments)
        {
            Vector<Object> row = new Vector<Object>();
            row.addElement(currentFile.getName());
            row.addElement(false);

            rowData.add(row);
        }

        this.model.addRow(rowData);
    }
}

public void addFile(File file)
{
    Vector<Object> row = new Vector<Object>();
    row.addElement(file.getName());
    row.addElement(false);

    this.model.addRow(row);
}

public List<File> getAttachments()
{
    return attachments;
}

public void setAttachments(List<File> attachments)
{
    this.attachments = attachments;
}

}

Это рабочий необработанный компонент, который показывает файлы, хранящиеся в списке.

Другие вопросы по тегам