用applet做一个C/S,服务器上的目录和文件分别显示在客户端界面2个List中。
希望1 选中List内的文件或文件夹后
2 右键点之时弹出菜单
3 菜单提供:文件大小信息item和下载item
4 文件/文件夹大小信息另启窗口显示;存储下载文件到客户端指定位置明确要求继承applet,应该怎么做?小弟初学,没有编程思想,想做个简单的服务器练手,以上问题在网上找了半天,只找到对控件做的,请大家帮帮忙
以下是客户端的List相关,希望在其中加入以上设计public class Homework_Client_Applet extends Applet implements ActionListener{
private List dirList = new List();
private List fileList = new List();
public void init(){
Panel lists = new Panel(new BorderLayout());
lists.add("North",new PanelBox(dirList,"Directories"));
lists.add("Center",new PanelBox(fileList,"Files"));
setLayout(new BorderLayout());
add("North",new PanelBox(status,"Status"));
add("Center",lists);
add("South",buttons);
dirList.addActionListener(this);
}
private void showDirectory(String cmd, String path){
try{
send(cmd,path);
path = in.readUTF();
send("list","dummy");
Homework_FileInfo[] list = (Homework_FileInfo[])in.readObject();
dirList.removeAll();
fileList.removeAll();
dirList.add("..");
long total = 0, nDirs = 0, nFiles = 0;
for(int i = 0; i < list.length; i ++){//分别在两个List显示服务器的目录信息和文件信息
if(list[i].isDirectory()){
nDirs++;
dirList.add(list[i].toString());
}
else{
nFiles++;
total += list[i].length();
fileList.add(list[i].toString());
}
}
}
catch(Exception e){
status.setText("Error: "+e);
}
}
public void actionPerformed(ActionEvent ae){
//不会写
}
}
希望1 选中List内的文件或文件夹后
2 右键点之时弹出菜单
3 菜单提供:文件大小信息item和下载item
4 文件/文件夹大小信息另启窗口显示;存储下载文件到客户端指定位置明确要求继承applet,应该怎么做?小弟初学,没有编程思想,想做个简单的服务器练手,以上问题在网上找了半天,只找到对控件做的,请大家帮帮忙
以下是客户端的List相关,希望在其中加入以上设计public class Homework_Client_Applet extends Applet implements ActionListener{
private List dirList = new List();
private List fileList = new List();
public void init(){
Panel lists = new Panel(new BorderLayout());
lists.add("North",new PanelBox(dirList,"Directories"));
lists.add("Center",new PanelBox(fileList,"Files"));
setLayout(new BorderLayout());
add("North",new PanelBox(status,"Status"));
add("Center",lists);
add("South",buttons);
dirList.addActionListener(this);
}
private void showDirectory(String cmd, String path){
try{
send(cmd,path);
path = in.readUTF();
send("list","dummy");
Homework_FileInfo[] list = (Homework_FileInfo[])in.readObject();
dirList.removeAll();
fileList.removeAll();
dirList.add("..");
long total = 0, nDirs = 0, nFiles = 0;
for(int i = 0; i < list.length; i ++){//分别在两个List显示服务器的目录信息和文件信息
if(list[i].isDirectory()){
nDirs++;
dirList.add(list[i].toString());
}
else{
nFiles++;
total += list[i].length();
fileList.add(list[i].toString());
}
}
}
catch(Exception e){
status.setText("Error: "+e);
}
}
public void actionPerformed(ActionEvent ae){
//不会写
}
}
popupMenu.setPopupSize(new Dimension(100, 100));
addPopup(this, popupMenu);
JMenuItem menuItem1 = new JMenuItem("menu item 1");
popupMenu.add(menuItem1);
JMenuItem menuItem2 = new JMenuItem("menu item 2");
popupMenu.add(menuItem2); addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.isMetaDown()){//检测鼠标右键单击
popupMenu.setVisible(true);
}
}
});
addPopup(this, popupMenu);
现在关于右键弹出菜单的任务已经完成了,代码我会贴在下面。
现在的问题是如何把列表的选中的内容从服务器端下载下来。
问题详细描述如下,看这次是我快还是您快~
C/S:服务器端开通特定端口,客户端接入后,客户端图形界面的列表将显示服务器内容
客户端列表分两块,一个为文件夹列表,一个为文件列表。
对应事件为:
1 双击文件夹列表的文件夹,会进入其中,双机“..”则返回父目录(此问题已解决);右键单击文件夹列表上任意文件夹,右键菜单功能有二--属性(显示文件夹大小)和下载(从服务器下载该文件夹)(此问题待解决)
2 双击文件列表的任意文件可以直接打开文件,而右键单击该文件右键菜单如1,属性和下载功能(均待解决)这2个问题会花费我很长时间,还是在此向大家求教。下面是我实现的右键菜单代码
init()中:
initPopupMenu();
// add listener for popup capability
list.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
checkPopup(e);
}
public void mouseReleased(MouseEvent e) {
checkPopup(e);
}
public void mouseClicked(MouseEvent e) {
checkPopup(e);
}
private void checkPopup(MouseEvent e) {
if (e.isPopupTrigger())
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
initPopupMenu()方法:
private void initPopupMenu() {
popupMenu = new PopupMenu("LayoutList");
Font font = new Font("Mono", Font.PLAIN, 12);
popupMenu.setFont(font);
MenuItem mnuSelect = new MenuItem("Select");
MenuItem mnuDeselect = new MenuItem("Deselect");
MenuItem mnuDelete = new MenuItem("Delete");
popupMenu.add(mnuSelect);
popupMenu.add(mnuDeselect);
popupMenu.addSeparator();
popupMenu.add(mnuDelete);
mnuSelect.addActionListener(this);
mnuDeselect.addActionListener(this);
mnuDelete.addActionListener(this);
add(popupMenu);
}
AWT和Swing当然能兼容。
代码如下
long nDirs = 0, nFiles = 0;
double total = 0, totalDir = 0, totalFile = 0;
for(int i = 0; i < list.length; i ++){
if(list[i].isDirectory()){
nDirs++;
totalDir += getFileSize((File)in.readObject());
dirList.add(list[i].toString());
}
else{
nFiles++;
totalFile += list[i].length();
fileList.add(list[i].toString());
}
}
}
catch(Exception e){
status.setText("Error: "+e);
}
private double getFileSize(File file)throws Exception{
double size = 0;
File[] flist = file.listFiles();
for(int i=0;i<flist.length;i++){
if(flist[i].isDirectory())
size += getFileSize(flist[i]);
else
size += flist[i].length();
}
return size;
}
有没有更有效率的算法?
只能遍历。
list中显示服务器的所有文件
希望在鼠标右键点击其上任一文件弹出下拉菜单,选择某一功能问题是,此时的actionPerformed(ActionEvent ae)的ae.getSource()是哪个对象?
是list还是右键的功能之一?