2016-03-23 9 views
0

Я написал программу, которая выбирает файлы и добавляет их в JList. Программа отлично работает, и код, чтобы добавить файлы в список, как это:Невозможно добавить в JList, когда список добавлен в JScrollPane

JPanel pane; 
File newFile[]; 
static List<File> files = new ArrayList<File>(); 
static DefaultListModel<File> listModel = new DefaultListModel<>(); 
JList<File> fileList = new JList<>(listModel); 

JPanel listPane = new JPanel(); 
pane.add(listPane, BorderLayout.CENTER); 
listPane.setBackground(Color.LIGHT_GRAY); 
listPane.setBorder(new EmptyBorder(0, 20, 0, 0)); 
listPane.setLayout(new BorderLayout()); 
listPane.add(fileList); 
} 
void getFile() { 
    final JFileChooser fc = new JFileChooser(); 
    fc.setDialogTitle("Select File..."); 
    fc.setApproveButtonText("Select"); 
    fc.setMultiSelectionEnabled(true); 
    int returnVal = fc.showOpenDialog(pane); 
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
     newFile = fc.getSelectedFiles(); 
    } 
} 
void setFile() { 
    int i = 0; 
    while (i < newFile.length) { 
     files.add(newFile[i]); 
     listModel.addElement(newFile[i]); 
     i++; 
    } 
} 

Это базовый код для выбора и добавления файлов. Так что теперь я хочу, чтобы иметь полосы прокрутки на панели, поэтому я изменил его на JScrollPane так:

JScrollPane listPane = new JScrollPane(); 
pane.add(listPane, BorderLayout.CENTER); 
listPane.setBackground(Color.LIGHT_GRAY); 
listPane.setBorder(new EmptyBorder(0, 20, 0, 0)); 
listPane.setViewportView(fileList); 
listPane.add(fileList); 
} 

Так что все компилируется без ошибок, но ничего не добавляют к JScrollPane. Я понимаю, что JScrollPane можно использовать как обычный JPanel, за исключением того, что он будет иметь полосы прокрутки при переполнении. Есть что-то в JScrollPanes, которых я здесь не хватает?

+0

Рекомендации: 1) Добавьте список в панель прокрутки, когда панель прокрутки создана и добавлена ​​в графический интерфейс. 2) После этого нужно иметь дело только с (добавьте элементы или удалите их) из модели. 3) Удалите 'static List files = new ArrayList ();' и получите любую информацию или 'Файл' непосредственно из модели. 4) Удалите префикс 'static' из' static DefaultListModel listModel = new DefaultListModel <>(); '. Статический редко является правильным решением (независимо от проблемы). 5) Для лучшей помощи, скорее всего, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

ответ

3

попробуйте удалить

listPane.add(fileList); //remove 

вы должны использовать setViewportView() метод для добавления компонента к scrollpane.and вы сделали it.so вам не нужно снова добавить по телефону listPane.add.

пример

JScrollPane listPane = new JScrollPane(); 
pane.add(listPane, BorderLayout.CENTER); 
listPane.setBackground(Color.LIGHT_GRAY); 
listPane.setBorder(new EmptyBorder(0, 20, 0, 0)); 
listPane.setViewportView(fileList); 
// removed add line 

также вы можете передать компонент, который вы хотите добавить в ScrollPane пропускания для прокрутки панели конструкторы, как сказал Томсон.

JScrollPane listPane = new JScrollPane(fileList); 

также, как Томсон сказал, что вы должны избегать объявления listModel ,files .Вы должны прочитать больше о static keyword and when you should use it.

+0

Я предпочитаю 'JScrollPane listPane = новый JScrollPane (fileList); // добавьте единственный компонент, который панель прокрутки будет когда-либо отображаться во время построения' (возможно, без подробного комментария). ;) –

+0

Это сделало. Кроме того, чтобы упорядочить его немного больше, я попробовал предложение Андрея добавить его прямо к конструктору 'JScrollPane', который также работал. Оба удивительных решения. Спасибо, парни. – user3226170