Мне нужно разрешить пользователям нажимать кнопку, чтобы выбрать каталог, затем я показываю все файлы каталога в списке и позволяю им выбирать любое количество файлов. После выбора файлов я должен прочитать первую строку каждого файла и поместить это в новый список для них.Как получить список выбранных элементов JList?
Пока что я могу выбрать каталог и показать список файлов. Однако проблема заключается в том, что приложение не будет отображать список файлов, если я не изменю размер окна. Как только я изменил размер, список обновится и покажет файлы. Как я могу решить проблему и как узнать, какие элементы выбраны из списка.
private JFrame frame;
final JFileChooser fc = new JFileChooser();
private JScrollPane scrollPane;
File directory;
JList<File> list;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main window = new Main();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Main() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 785, 486);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton btnChooseDirectory = new JButton("Choose Directory");
btnChooseDirectory.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fc.showOpenDialog(fc);
if (returnVal == JFileChooser.APPROVE_OPTION) {
directory = fc.getSelectedFile();
File[] filesInDir = directory.getAbsoluteFile().listFiles();
addFilesToList(filesInDir);
}
}
});
btnChooseDirectory.setBounds(59, 27, 161, 29);
frame.getContentPane().add(btnChooseDirectory);
JLabel lblFilesMsg = new JLabel("List of files in the directory.");
lblFilesMsg.setBounds(20, 59, 337, 16);
frame.getContentPane().add(lblFilesMsg);
JButton btnParseXmls = new JButton("Analyze");
btnParseXmls.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (File name : list.getSelectedValuesList()) {
System.err.println(name.getAbsolutePath());
}
}
});
btnParseXmls.setBounds(333, 215, 117, 29);
frame.getContentPane().add(btnParseXmls);
}
private void addFilesToList(File[] filesInDir){
list = new JList<File>(filesInDir);
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
scrollPane = new JScrollPane(list);
scrollPane.setBounds(20, 81, 318, 360);
frame.getContentPane().add(scrollPane);
}
}
Я вижу, что использовать, предлагаю заменить на null? – Jack
«GridBagLayout» приходит на ум, но вы можете использовать комбинацию 'BorderLayout' и' FlowLayout' в зависимости от того, насколько сложным вы хотите UI – MadProgrammer
Как я уже сказал, я добавил GroupLayout в фрейм и назвал метод revalidate, но все же такая же проблема – Jack