第五章:
下面开始进行左边面板的开发:LeftPanel
左边是一个排列的窗口,这个需要用java的JTabbedPane来实现。
我们规划这个窗口至少包含 本地目录的选择,和,网络目录的选择。我们在构造两个panel继承jpanel,分别为:LocalPanel,NetworkPanel,然后将它们添加入这个窗口。看代码实现:
LeftPanel.java
public
class
LeftPanel
extends
JPanel
...
{
public LeftPanel()...{
//添加标题窗口
JTabbedPane tabbedPane = new JTabbedPane();
//添加第一个窗口
LocalPanel localPanel = new LocalPanel();
tabbedPane.addTab(DTDInfo.getLeftPanel_TabLocal(),localPanel);
//添加第二个窗口
NetworkPanel networkPanel = new NetworkPanel();
tabbedPane.addTab(DTDInfo.getLeftPanel_TabNetwork(),networkPanel);
tabbedPane.setBackground(Color.white);
//支持滚动
JScrollPane scrollPane = new JScrollPane(tabbedPane);
//设置滚动速度
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
this.setLayout(new GridLayout(1,1));
this.add(scrollPane);
}
}
public LeftPanel()...{
//添加标题窗口
JTabbedPane tabbedPane = new JTabbedPane();
//添加第一个窗口
LocalPanel localPanel = new LocalPanel();
tabbedPane.addTab(DTDInfo.getLeftPanel_TabLocal(),localPanel);
//添加第二个窗口
NetworkPanel networkPanel = new NetworkPanel();
tabbedPane.addTab(DTDInfo.getLeftPanel_TabNetwork(),networkPanel);
tabbedPane.setBackground(Color.white);
//支持滚动
JScrollPane scrollPane = new JScrollPane(tabbedPane);
//设置滚动速度
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
this.setLayout(new GridLayout(1,1));
this.add(scrollPane);
}
}
这是后执行程序,我们看到:
LocalPanel,我们将在其中添加一个本地文件的选择器,这里的这个文件选择器,也用一个类来实现
public
class
LocalPanel
extends
JPanel
...
{
public LocalPanel()...{
FileChooserPanel chooser = new FileChooserPanel();
//chooser.setBackground(Color.red);
this.setLayout(new GridLayout(1,1));
this.add(chooser);
this.setBackground(Color.blue);
}
}
public LocalPanel()...{
FileChooserPanel chooser = new FileChooserPanel();
//chooser.setBackground(Color.red);
this.setLayout(new GridLayout(1,1));
this.add(chooser);
this.setBackground(Color.blue);
}
}
如何实现FileChooserPanel呢?
public
class
FileChooserPanel
extends
JPanel
...
{
public FileChooserPanel()...{
//添加最上面的文本提示框,用来显示当前选中的文件
JTextField jtf = new JTextField();
//jtf.setBackground(Color.white);
jtf.setEditable(false);
//实现一个文件选择器
DTDJFileChooser chooser = new DTDJFileChooser(jtf);
this.setLayout(new BorderLayout());
this.setBorder(null);
this.add(jtf,BorderLayout.NORTH);
this.add(chooser,BorderLayout.CENTER);
}
}
public FileChooserPanel()...{
//添加最上面的文本提示框,用来显示当前选中的文件
JTextField jtf = new JTextField();
//jtf.setBackground(Color.white);
jtf.setEditable(false);
//实现一个文件选择器
DTDJFileChooser chooser = new DTDJFileChooser(jtf);
this.setLayout(new BorderLayout());
this.setBorder(null);
this.add(jtf,BorderLayout.NORTH);
this.add(chooser,BorderLayout.CENTER);
}
}
这里实现DTDJFileChooser我们使用了java的JTree,至于这个对象的详细使用,大家可以参考java的手册,这里提供实现的源代码。
DTDJFileChooser.java
package
comm;
import java.awt.Component;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
class FileNode extends DefaultMutableTreeNode ... {
private boolean explored = false;
public FileNode(File file) ...{
setUserObject(file);
}
public boolean getAllowsChildren() ...{
return isDirectory();
}
public boolean isLeaf() ...{
return !isDirectory();
}
public File getFile() ...{
return (File) getUserObject();
}
public boolean isExplored() ...{
return explored;
}
public boolean isDirectory() ...{
File file = getFile();
return file.isDirectory();
}
public String toString() ...{
File file = (File) getUserObject();
String filename = file.toString();
int index = filename.lastIndexOf(File.separator);
return (index != -1 && index != filename.length() - 1) ? filename
.substring(index + 1) : filename;
}
public void explore() ...{
if (!isDirectory())
return;
if (!isExplored()) ...{
File file = getFile();
File[] children = file.listFiles();
for (int i = 0; i < children.length; ++i) ...{
if (children[i].isDirectory())
...{
if(children[i].isHidden())...{
continue;
}
add(new FileNode(children[i]));
}
}
for (int i = 0; i < children.length; ++i) ...{
if (!children[i].isDirectory())
...{
if(children[i].isHidden())...{
continue;
}
add(new FileNode(children[i]));
}
}
explored = true;
}
}
public void reexplore() ...{
this.removeAllChildren();
explored = false;
explore();
}
}
public class DTDJFileChooser extends JTree ... {
private JTextField curPahtField;
private PopupMenu popupMenu = new PopupMenu();
private DTDJFileChooser thisptr;
public void refreshTree()...{
this.setModel(createTreeModel());
}
public DTDJFileChooser(JTextField jtf)...{
this.curPahtField = jtf;
this.setModel(createTreeModel());
thisptr = this;
MenuItem p1 = new MenuItem();
MenuItem p2 = new MenuItem();
p1.setLabel(DTDInfo.getDTDJFileChooser_UploadFile());
p1.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e) ...{
// TODO Auto-generated method stub
//JOptionPane.showMessageDialog(null,"hello");
TreePath[] tp = thisptr.getSelectionPaths();
if(tp!=null)...{
for(int i=0;i<tp.length;i++)...{
FileNode node = (FileNode)tp[i].getLastPathComponent();
System.out.println(node.getFile().getAbsolutePath());
if(node.getFile().isFile())...{
//DTDCommTool.uploadFile(DTDCommObj.curLocalFile, DTDCommObj.curNetDisk);
//NetViewPanel nvp = (NetViewPanel)DTDCommObj.netviewPanelContainer.getSelectedComponent();
//nvp.thread_uploadFile(node.getFile());
}
}
}
}
});
p2.setLabel(DTDInfo.getDTDJFileChooser_Refresh());
p2.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e) ...{
refreshTree();
}
});
popupMenu.add(p1);
popupMenu.addSeparator();
popupMenu.add(p2);
thisptr.add(popupMenu);
this.addMouseListener(new MouseListener()...{
public void mouseClicked(MouseEvent arg0) ...{
// TODO Auto-generated method stub
if(arg0.getClickCount()==2)...{
//System.out.println(DTDCommObj.curLocalFile.getAbsolutePath());
//双击事件
}
}
public void mouseEntered(MouseEvent arg0) ...{
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent arg0) ...{
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent arg0) ...{
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent arg0) ...{
// TODO Auto-generated method stub
int mods=arg0.getModifiers();
if((mods&InputEvent.BUTTON3_MASK)!=0)...{
popupMenu.show(thisptr,arg0.getX(),arg0.getY());
}
}
});
this.addTreeSelectionListener(new TreeSelectionListener()...{
public void valueChanged(TreeSelectionEvent e) ...{
// TODO Auto-generated method stub
TreePath path = e.getPath();
if (path != null) ...{
FileNode node = (FileNode) path.getLastPathComponent();
//DTDCommObj.curLocalFile = node.getFile();
// curPahtField.setText(DTDCommObj.curLocalFile.getAbsolutePath());
curPahtField.setToolTipText(curPahtField.getText());
}
}
});
this.addTreeExpansionListener(new TreeExpansionListener() ...{
public void treeCollapsed(TreeExpansionEvent e) ...{
}
public void treeExpanded(TreeExpansionEvent e) ...{
TreePath path = e.getPath();
if (path != null) ...{
FileNode node = (FileNode) path.getLastPathComponent();
//DTDCommObj.curLocalFile = node.getFile();
//curPahtField.setText(DTDCommObj.curLocalFile.getAbsolutePath());
//File file = node.getFile();
//System.out.println(file.getPath());
if (!node.isExplored()) ...{
DefaultTreeModel model = (DefaultTreeModel) getModel();
node.explore();
model.nodeStructureChanged(node);
}
}
}
});
this.setCellRenderer(new DefaultTreeCellRenderer() ...{
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) ...{
TreePath tp = tree.getPathForRow(row);
if (tp != null) ...{
FileNode node = (FileNode) tp.getLastPathComponent();
File f = node.getFile();
try ...{
Icon icon = FileSystemView.getFileSystemView()
.getSystemIcon(f);
this.setIcon(icon);
this.setLeafIcon(icon);
this.setOpenIcon(icon);
this.setClosedIcon(icon);
this.setDisabledIcon(icon);
} catch (Exception e) ...{
e.printStackTrace();
}
}
return super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
}
});
}
private DefaultTreeModel createTreeModel() ...{
File root = FileSystemView.getFileSystemView().getRoots()[0];
FileNode rootNode = new FileNode(root);
rootNode.explore();
return new DefaultTreeModel(rootNode);
}
}
import java.awt.Component;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
class FileNode extends DefaultMutableTreeNode ... {
private boolean explored = false;
public FileNode(File file) ...{
setUserObject(file);
}
public boolean getAllowsChildren() ...{
return isDirectory();
}
public boolean isLeaf() ...{
return !isDirectory();
}
public File getFile() ...{
return (File) getUserObject();
}
public boolean isExplored() ...{
return explored;
}
public boolean isDirectory() ...{
File file = getFile();
return file.isDirectory();
}
public String toString() ...{
File file = (File) getUserObject();
String filename = file.toString();
int index = filename.lastIndexOf(File.separator);
return (index != -1 && index != filename.length() - 1) ? filename
.substring(index + 1) : filename;
}
public void explore() ...{
if (!isDirectory())
return;
if (!isExplored()) ...{
File file = getFile();
File[] children = file.listFiles();
for (int i = 0; i < children.length; ++i) ...{
if (children[i].isDirectory())
...{
if(children[i].isHidden())...{
continue;
}
add(new FileNode(children[i]));
}
}
for (int i = 0; i < children.length; ++i) ...{
if (!children[i].isDirectory())
...{
if(children[i].isHidden())...{
continue;
}
add(new FileNode(children[i]));
}
}
explored = true;
}
}
public void reexplore() ...{
this.removeAllChildren();
explored = false;
explore();
}
}
public class DTDJFileChooser extends JTree ... {
private JTextField curPahtField;
private PopupMenu popupMenu = new PopupMenu();
private DTDJFileChooser thisptr;
public void refreshTree()...{
this.setModel(createTreeModel());
}
public DTDJFileChooser(JTextField jtf)...{
this.curPahtField = jtf;
this.setModel(createTreeModel());
thisptr = this;
MenuItem p1 = new MenuItem();
MenuItem p2 = new MenuItem();
p1.setLabel(DTDInfo.getDTDJFileChooser_UploadFile());
p1.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e) ...{
// TODO Auto-generated method stub
//JOptionPane.showMessageDialog(null,"hello");
TreePath[] tp = thisptr.getSelectionPaths();
if(tp!=null)...{
for(int i=0;i<tp.length;i++)...{
FileNode node = (FileNode)tp[i].getLastPathComponent();
System.out.println(node.getFile().getAbsolutePath());
if(node.getFile().isFile())...{
//DTDCommTool.uploadFile(DTDCommObj.curLocalFile, DTDCommObj.curNetDisk);
//NetViewPanel nvp = (NetViewPanel)DTDCommObj.netviewPanelContainer.getSelectedComponent();
//nvp.thread_uploadFile(node.getFile());
}
}
}
}
});
p2.setLabel(DTDInfo.getDTDJFileChooser_Refresh());
p2.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent e) ...{
refreshTree();
}
});
popupMenu.add(p1);
popupMenu.addSeparator();
popupMenu.add(p2);
thisptr.add(popupMenu);
this.addMouseListener(new MouseListener()...{
public void mouseClicked(MouseEvent arg0) ...{
// TODO Auto-generated method stub
if(arg0.getClickCount()==2)...{
//System.out.println(DTDCommObj.curLocalFile.getAbsolutePath());
//双击事件
}
}
public void mouseEntered(MouseEvent arg0) ...{
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent arg0) ...{
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent arg0) ...{
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent arg0) ...{
// TODO Auto-generated method stub
int mods=arg0.getModifiers();
if((mods&InputEvent.BUTTON3_MASK)!=0)...{
popupMenu.show(thisptr,arg0.getX(),arg0.getY());
}
}
});
this.addTreeSelectionListener(new TreeSelectionListener()...{
public void valueChanged(TreeSelectionEvent e) ...{
// TODO Auto-generated method stub
TreePath path = e.getPath();
if (path != null) ...{
FileNode node = (FileNode) path.getLastPathComponent();
//DTDCommObj.curLocalFile = node.getFile();
// curPahtField.setText(DTDCommObj.curLocalFile.getAbsolutePath());
curPahtField.setToolTipText(curPahtField.getText());
}
}
});
this.addTreeExpansionListener(new TreeExpansionListener() ...{
public void treeCollapsed(TreeExpansionEvent e) ...{
}
public void treeExpanded(TreeExpansionEvent e) ...{
TreePath path = e.getPath();
if (path != null) ...{
FileNode node = (FileNode) path.getLastPathComponent();
//DTDCommObj.curLocalFile = node.getFile();
//curPahtField.setText(DTDCommObj.curLocalFile.getAbsolutePath());
//File file = node.getFile();
//System.out.println(file.getPath());
if (!node.isExplored()) ...{
DefaultTreeModel model = (DefaultTreeModel) getModel();
node.explore();
model.nodeStructureChanged(node);
}
}
}
});
this.setCellRenderer(new DefaultTreeCellRenderer() ...{
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) ...{
TreePath tp = tree.getPathForRow(row);
if (tp != null) ...{
FileNode node = (FileNode) tp.getLastPathComponent();
File f = node.getFile();
try ...{
Icon icon = FileSystemView.getFileSystemView()
.getSystemIcon(f);
this.setIcon(icon);
this.setLeafIcon(icon);
this.setOpenIcon(icon);
this.setClosedIcon(icon);
this.setDisabledIcon(icon);
} catch (Exception e) ...{
e.printStackTrace();
}
}
return super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
}
});
}
private DefaultTreeModel createTreeModel() ...{
File root = FileSystemView.getFileSystemView().getRoots()[0];
FileNode rootNode = new FileNode(root);
rootNode.explore();
return new DefaultTreeModel(rootNode);
}
}
当添加了这个类以后是什么样子呢?
呵,本地文件的选择,可以先放在一边了,我们继续开发网络管理器,这个面板。
显然,网络管理器,我们也是用JTree来实现会比较好。我们用NetworkTree来实现这个tree
作为程序的开发测试,我先写死两个用户名称来测试:
NetworkPanel.java
package
panel;
import java.awt.Component;
import java.awt.GridLayout;
import java.io.File;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
class NetworkNode extends DefaultMutableTreeNode ... {
private boolean flag;
private String name;
public NetworkNode(boolean i,String name)...{
flag = i;
this.name = name;
}
public boolean getAllowsChildren() ...{
return flag;
}
public boolean isLeaf() ...{
return !flag;
}
public String getName()...{
return name;
}
}
class NetworkTree extends JTree ... {
NetworkPanel networkPanel;
public NetworkTree(NetworkPanel tmp,DefaultTreeModel model)...{
super(model);
networkPanel = tmp;
this.setCellRenderer(new DefaultTreeCellRenderer() ...{
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) ...{
TreePath tp = tree.getPathForRow(row);
File f;
if(tp!=null)...{
NetworkNode node = (NetworkNode)tp.getLastPathComponent();
if(node.isLeaf())...{
f = new File("tmp.txt");
try...{
f.createNewFile();
}catch(Exception e)...{
}
}
else...{
f = new File("tmpdir");
try...{
f.mkdir();
}catch(Exception e)...{
}
}
}
else...{
f = new File("tmpdir");
try...{
f.mkdir();
}catch(Exception e)...{
}
}
if (tp != null) ...{
try ...{
Icon icon = FileSystemView.getFileSystemView()
.getSystemIcon(f);
this.setIcon(icon);
this.setLeafIcon(icon);
this.setOpenIcon(icon);
this.setClosedIcon(icon);
this.setDisabledIcon(icon);
} catch (Exception e) ...{
e.printStackTrace();
}
}
return super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
}
});
}
}
public class NetworkPanel extends JPanel ... {
public DefaultMutableTreeNode root;
NetworkTree tree;
DefaultTreeModel model;
public NetworkPanel()...{
root = new NetworkNode(true,"root");
DefaultMutableTreeNode user1 = new NetworkNode(false,"qq");
user1.setUserObject("94640508@qq.com");
DefaultMutableTreeNode user2 = new NetworkNode(false,"google");
user2.setUserObject("018008.com@google.com");
user1.setAllowsChildren(false);
user2.setAllowsChildren(false);
root.setAllowsChildren(true);
root.add(user1);
root.add(user2);
model = new DefaultTreeModel(root);
tree = new NetworkTree(this,model);
this.setLayout(new GridLayout(1,1));
this.add(tree);
}
}
import java.awt.Component;
import java.awt.GridLayout;
import java.io.File;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
class NetworkNode extends DefaultMutableTreeNode ... {
private boolean flag;
private String name;
public NetworkNode(boolean i,String name)...{
flag = i;
this.name = name;
}
public boolean getAllowsChildren() ...{
return flag;
}
public boolean isLeaf() ...{
return !flag;
}
public String getName()...{
return name;
}
}
class NetworkTree extends JTree ... {
NetworkPanel networkPanel;
public NetworkTree(NetworkPanel tmp,DefaultTreeModel model)...{
super(model);
networkPanel = tmp;
this.setCellRenderer(new DefaultTreeCellRenderer() ...{
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) ...{
TreePath tp = tree.getPathForRow(row);
File f;
if(tp!=null)...{
NetworkNode node = (NetworkNode)tp.getLastPathComponent();
if(node.isLeaf())...{
f = new File("tmp.txt");
try...{
f.createNewFile();
}catch(Exception e)...{
}
}
else...{
f = new File("tmpdir");
try...{
f.mkdir();
}catch(Exception e)...{
}
}
}
else...{
f = new File("tmpdir");
try...{
f.mkdir();
}catch(Exception e)...{
}
}
if (tp != null) ...{
try ...{
Icon icon = FileSystemView.getFileSystemView()
.getSystemIcon(f);
this.setIcon(icon);
this.setLeafIcon(icon);
this.setOpenIcon(icon);
this.setClosedIcon(icon);
this.setDisabledIcon(icon);
} catch (Exception e) ...{
e.printStackTrace();
}
}
return super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
}
});
}
}
public class NetworkPanel extends JPanel ... {
public DefaultMutableTreeNode root;
NetworkTree tree;
DefaultTreeModel model;
public NetworkPanel()...{
root = new NetworkNode(true,"root");
DefaultMutableTreeNode user1 = new NetworkNode(false,"qq");
user1.setUserObject("94640508@qq.com");
DefaultMutableTreeNode user2 = new NetworkNode(false,"google");
user2.setUserObject("018008.com@google.com");
user1.setAllowsChildren(false);
user2.setAllowsChildren(false);
root.setAllowsChildren(true);
root.add(user1);
root.add(user2);
model = new DefaultTreeModel(root);
tree = new NetworkTree(this,model);
this.setLayout(new GridLayout(1,1));
this.add(tree);
}
}
这时的界面:
呵呵,好了,该打个包了。
http://www.018008.com/v/D2D1.0_4.rar