package org.andork.swing.list; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.File; import java.util.Arrays; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.andork.awt.GridBagWizard; import org.andork.q.QArrayList; import org.andork.q.QList; import org.andork.swing.QuickTestFrame; public class QFileListEditor extends JPanel { private static final long serialVersionUID = -7659154410942818791L; public static void main(String[] args) { QFileListEditor view = new QFileListEditor(); view.setModel(new QArrayList<>()); QuickTestFrame.frame(view).setVisible(true); } boolean listening; QList<File, ?> model; JList<File> list; JScrollPane listScroller; JButton removeButton; JButton addButton; Action addAction; Action removeAction; JFileChooser fileChooser; public QFileListEditor() { setBorder(new EmptyBorder(5, 5, 5, 5)); initComponents(); initLayout(); initActions(); initListeners(); } @SuppressWarnings("serial") void initActions() { addAction = new AbstractAction("Add...") { @Override public void actionPerformed(ActionEvent e) { int option = fileChooser.showOpenDialog(SwingUtilities.getWindowAncestor(QFileListEditor.this)); if (option == JFileChooser.APPROVE_OPTION && model != null) { model.addAll(Arrays.asList(fileChooser.getSelectedFiles())); } } }; removeAction = new AbstractAction("Remove Selected") { @Override public void actionPerformed(ActionEvent e) { if (model != null) { int[] selectedIndices = list.getSelectedIndices(); for (int i = selectedIndices.length - 1; i >= 0; i--) { model.remove(selectedIndices[i]); } list.clearSelection(); } } }; } void initComponents() { list = new JList<>(); listScroller = new JScrollPane(list); addButton = new JButton("Add"); removeButton = new JButton("Remove Selected"); removeButton.setEnabled(false); fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fileChooser.setMultiSelectionEnabled(true); } void initLayout() { GridBagWizard w = GridBagWizard.create(this); listScroller.setPreferredSize(new Dimension(200, 300)); w.put(addButton, removeButton).intoRow().y(0).fillx(1.0); w.put(listScroller).above(addButton, removeButton).fillboth(0.0, 1.0); } void initListeners() { addButton.setAction(addAction); removeButton.setAction(removeAction); list.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "removeItem"); list.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), "removeItem"); list.getActionMap().put("removeItem", removeAction); list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { removeButton.setEnabled(!list.isSelectionEmpty()); } }); } public void setModel(QList<File, ?> model) { if (this.model != model) { this.model = model; list.setModel(model != null ? new QListListModel<>(model) : new DefaultListModel<>()); removeButton.setEnabled(!list.isSelectionEmpty()); } } }