Обновить пользовательский контейнер через кнопку внутри него в 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;
}
}
Это рабочий необработанный компонент, который показывает файлы, хранящиеся в списке.