2016-03-23 26 views
0

listesine eklendiğinde JList eklenemiyor Dosyaları seçen ve bunları JList'e ekleyen bir program yazdım. Program çalışıyor ve listeye dosyaları eklemek için kod şu şekildedir:Bir 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++; 
    } 
} 

Bu seçme ve dosya eklemek için taban kodudur. Yani şimdi ben bölmesinde bir kaydırma çubuğu istiyoruz, bu yüzden böyle bir JScrollPane onu modifiye:

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); 
} 

Yani her şey hatasız derler, ama hiçbir şey JScrollPane eklenir. Bir JScrollPane'in normal bir JPanel gibi kullanılabilmesi benim anlayışım, taşma sırasında kaydırma çubukları olması dışında. JScrollPanes hakkında burada eksik olduğum bir şey var mı?

+0

Tavsiyeler: 1) Kaydırma bölmesi oluşturulduğunda ve GUI'ye eklendiğinde, listeyi kaydırma bölmesine ekleyin. 2) Bundan sonra, sadece modele (bunlara öğeler eklemek veya bunları kaldırmak) ile başa çıkmak. 3) 'Statik Listeyi dosyaları = yeni ArrayList ();' kaldırın ve modelden doğrudan herhangi bir bilgi veya 'Dosya 'alın. 4) Statik defaultListModel listModel = new DefaultListModel <>(); '' statik 'önekini kaldırın. Statik nadiren doğru çözümdür (problem ne olursa olsun). 5) Daha iyi yardım için, bir [MCVE] veya [Kısa, Kendini İçeren, Doğru Örnek] (http://www.sscce.org/) gönderin. –

cevap

3

size listPane.add arayarak tekrar eklemeye gerek yoktur it.so yapmış scrollpane.and bir bileşen eklemek için setViewportView() yöntemi kullanmalısınız

listPane.add(fileList); //remove 

çıkarmayı deneyin.

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 

örnek de size Thompson söylediği gibi bölmesi yapıcısı kaydırmak için geçirerek ScrollPane eklemek istediğiniz bileşeni geçebilir.

JScrollPane listPane = new JScrollPane(fileList); 

da Thompson sen .gerçekten static keyword and when you should use it hakkında daha fazla okumalısınız listModel ,files ilan önlemek gerektiğini söylediği gibi.

+0

Tercih ediyorum JScrollPane listPane = yeni JScrollPane (fileList); // bu kaydırma bölmesinin, yapım sırasında (belki de ayrıntılı bir açıklama olmadan) göstereceği tek bileşeni ekleyin. ;) –

+0

Bunu yaptı. Ayrıca, biraz daha fazla düzene koymak için, Andrew'ın da çalıştığı 'JScrollPane' kurucusuna doğru eklenme önerisini denedim. Her iki harika çözüm. Teşekkürler beyler. – user3226170

İlgili konular