1

我创建了一个项目,该项目将从 ftp 服务器下载图像的缩略图并使用 JLabel 将其显示在面板中。图像正在显示,但面板的布局只有在我再次调用面板(即使用框架上的按钮)时才有效,然后布局会自动更正。我究竟做错了什么?这是代码

编辑-用 sscce 更新了代码

1. sscce.java 

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 *
 * @author Rohn
 */
public class Sscce implements Interface{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        frame.setVisible(true);
        //frame.add(sci.);
        Container c=frame.getContentPane();
        JButton button=new JButton("Recall ShowCategoryImagesFunction");
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                sci.ShowCategoryImagesFunction("\\Nature\\Black And White"); //for testing purpose only
                                                                             // if button is pressed then we get right layout and image load
            }
        });
        c.setLayout(new FlowLayout());
        c.add(button);
        c.add(sci.ShowCategoryImagesFunction("\\Nature\\Black And White")); // default path for image load for first time
                                                                            // problem in correctly loading images and text with layout
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

2. ShowCategoryImages.java  

package sscce;  

import it.sauronsoftware.ftp4j.FTPClient;  
import it.sauronsoftware.ftp4j.FTPFile;  
import java.awt.FlowLayout;  
import java.awt.event.MouseAdapter;  
import java.awt.event.MouseEvent;  
import java.io.File;  
import javax.swing.ImageIcon;  
import javax.swing.JLabel;  
import javax.swing.JPanel;  
import javax.swing.SwingConstants;  
public class ShowCategoryImages{  
//FTPClient client=null;  
JPanel panel=new JPanel();   
JLabel label=new JLabel();  
FTPClient client=new FTPConnection().FTPConnection();  
FTPFile[] list;  
File thumbnails;  
File[] files;  
ImageIcon icon;  
public JPanel ShowCategoryImagesFunction(String path){  
// delete all the components on reload  
 if(panel.getComponents().length>0){  
     System.out.println(panel.getComponents().length);  
     panel.removeAll();  
            panel.revalidate();  
            panel.repaint();  
 }  
       //panel.setLayout(new GridLayout(0,4,2,2));  
 //panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));  
 panel.setLayout(new FlowLayout());  
             panel.revalidate();  
            panel.repaint();  
            panel.updateUI();  
       try{  
           //images in /wallpapers/nature/black and white/thumb  
       client.changeDirectory("\\Wallpapers"+path+"\\thumb"); //path of thumbnails  
       //temporary folder for holding images  
       thumbnails=new File("Thumbnails");  
       list=client.list();  
       if(thumbnails.exists()){  
   files = thumbnails.listFiles();  
    if(files!=null) { //some JVMs return null for empty dirs  
        for(File f: files) {  
             f.delete();  
        }  
    }  
       }  
       else  
       thumbnails.mkdir();  
       for(int i=0;i<list.length;i++){  
           System.out.println("running");  
           icon=new ImageIcon(thumbnails.getAbsolutePath()+"\\"+list[i].getName());  
           icon.getImage().flush(); 
           client.download(client.currentDirectory()+"\\"+list[i].getName(), new java.io.File(thumbnails.getAbsolutePath()+"\\"+list[i].getName()));  
label=new JLabel(list[i].getName());  
           label.setIcon(icon);  
           label.setVerticalTextPosition(SwingConstants.BOTTOM);  
           label.setHorizontalTextPosition(SwingConstants.CENTER);  
            panel.add(label);  
            panel.revalidate();  
            panel.repaint();  
            label.addMouseListener(new MouseAdapter(){  
            public void mousePressed(MouseEvent e){  
                JLabel la=(JLabel)e.getSource();  
                System.out.println(la.getIcon());  
            }  
            });  
           }  
            //client.disconnect(true);  
       }catch(Exception e){  
           System.out.println(e.getMessage());  
       }  
       return panel;  
    }  
   }




3. FTPConnection.java  

import it.sauronsoftware.ftp4j.FTPClient;  
public class FTPConnection {  
//ftp connection on local host  
public static FTPClient FTPConnection(){  
String ftphost="127.0.0.1";  
String ftpuser="newuser";  
String ftppassword="wampp";  
int ftpport=21;   
FTPClient client=new FTPClient();  
try{  
if(client.isConnected()==true){  
client.disconnect(true);  
};  
client.connect(ftphost, ftpport);  
client.login(ftpuser, ftppassword);  
}  
catch(Exception e){  
System.out.println(e.getMessage());  
}  
return client;  
}  
} 
4

1 回答 1

3

不完全确定您的意思not layout,但您的代码在添加标签后缺少重新验证/重新绘制:

// adding all labels
forEach (thumb....) {
   JLabel label = new JLabel(thumb);
   panel.add(label);
}
panel.revalidate();
panel.repaint();
于 2013-03-30T10:50:14.793 回答