最近在做一个简单的J2SE程序,就是调用百度的搜索引擎,然后在程序里能显示搜索结果,然后还自动把搜索结果保存到硬盘,现在在自定义保存路径这里碰到了麻烦: 我用JTree做的路径选择的界面,得到的路径的方法是在鼠标点击事件处理的内部类中,定义的路径变量(filepath)在内部类里改变,但当把它传递给另外一个要用它来建立文件的类时,就老是传不过去,两个类文件代码如下: PathToSave.java(提供保存路径的选择): package com.liu.Information; import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; import javax.swing.*; 
import javax.swing.tree.*; 
import javax.swing.event.*; /*不能让在关闭这个JFrame时把主窗口都关闭了*/ 
//extends JFrame public class PathToSave extends JFrame { protected JTree m_tree; protected DefaultTreeModel m_model;//一个目录树模型 protected JTextField m_display;// m_display就是显示目录的那个JTextField JButton ok; static String heihei; 
public PathToSave() { 
super("浏览--选定后请点下方的提交按钮"); 
setSize(400, 300); DefaultMutableTreeNode top = new DefaultMutableTreeNode("我的电脑");//第一个节点 
DefaultMutableTreeNode node;//定义第一个节点下边的节点 File[] roots = File.listRoots();//建立一个文件目录的数组 
for (int k = 0; k < roots.length; k++) { 
node = new DefaultMutableTreeNode(new FileNode(roots[k]));//从k=0开始建立新的节点 
top.add(node);//建立完一个就添加到top里边去 
node.add(new DefaultMutableTreeNode(new Boolean(true)));//添加新建的无父无母但有子节点的节点 
} m_model = new DefaultTreeModel(top);//以top节点为首节点建立一个目录树模型 
m_tree = new JTree(m_model);//目录树以目录树模型m_model建立目录树 
m_tree.putClientProperty("JTree.lineStyle", "Angled"); m_tree.addTreeExpansionListener(new DirExpansionListener());//添加响应 m_tree.addTreeSelectionListener(new DirSelectionListener());//添加响应 m_tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
m_tree.setShowsRootHandles(true);//设置显示源处理??? 
m_tree.setEditable(false); JScrollPane s = new JScrollPane();//新建一个滚动的Pane 
s.getViewport().add(m_tree);//把m_tree添加到滚动的pane里去 
getContentPane().add(s, BorderLayout.CENTER);//把s添加到JFrame的中央 m_display = new JTextField(); 
m_display.setEditable(false); 
getContentPane().add(m_display, BorderLayout.NORTH);//把m_display添加到JFrame的北方 
//当单击OK按钮时把路径参数给得到传递到创建HTML文件的类中 
ok=new JButton("提交选择的路径"); 
ok.setBackground(Color.ORANGE); 
getContentPane().add(ok,BorderLayout.SOUTH);//把ok添加到JFrame的南方 
//ok.addActionListener(); 
// 要使关闭这个frame时不关闭主frame怎么办?//难道可以说不要加处理方法就可以了? 
WindowListener wndCloser = new WindowAdapter() { 
public void windowClosing(WindowEvent e) { 
System.exit(0); 

}; 
addWindowListener(wndCloser); 
setVisible(true); 
}//end of structured method DefaultMutableTreeNode getTreeNode(TreePath path) { 
return (DefaultMutableTreeNode) (path.getLastPathComponent()); 
} FileNode getFileNode(DefaultMutableTreeNode node) { 
if (node == null) 
return null; 
Object obj = node.getUserObject(); 
if (obj instanceof FileNode) 
return (FileNode) obj; 
else 
return null; 
} // Make sure expansion is threaded and updating the tree model 
// only occurs within the event dispatching thread. 
class DirExpansionListener implements TreeExpansionListener { 
public void treeExpanded(TreeExpansionEvent event) { 
final DefaultMutableTreeNode node = getTreeNode(event.getPath()); 
final FileNode fnode = getFileNode(node); Thread runner = new Thread() { 
public void run() { 
if (fnode != null && fnode.expand(node)) { 
Runnable runnable = new Runnable() { 
public void run() { 
m_model.reload(node); 

}; 
SwingUtilities.invokeLater(runnable); 


}; 
runner.start(); 
} public void treeCollapsed(TreeExpansionEvent event) { 

}// end of DirExpansionListener class DirSelectionListener implements TreeSelectionListener { 
public void valueChanged(TreeSelectionEvent event) { 
DefaultMutableTreeNode node = getTreeNode(event.getPath()); 
FileNode fnode = getFileNode(node); 
if (fnode != null) { 
m_display.setText(fnode.getFile().getAbsolutePath()); 
String yoxi = fnode.getFile().getAbsolutePath(); 
setHeihei(yoxi); 
System.out.println("当前目录是:"+yoxi); 
System.out.println("heihei变成了:"+heihei); 
//为什么在这里getHeihei()就是正常的值,到了另外一个类里边使用就是null了? 
System.out.println("heihei现在是:"+getHeihei()); 
//print();//最好是要在点了某个OK按钮后才使得heihei的值变成path 
//能不能在这里把heihei传给本类里边的static变量,再把static变量传给别的类? 
} else 
m_display.setText(""); 

}// end of class DirSelectionListener 
public static String getHeihei(){ 
return heihei; 
} public static void setHeihei(String heihei) { 
PathToSave.heihei = heihei; 
} // 这里是main方法,当要被别的类调用时就把此处注释 
public static void main(String argv[]) { 
new PathToSave(); 

}//end of class PathToSave //下边是FileNode类,CSDN说帖子太长,就省略了。
class FileNode{
   *****
}// end of class FileNode 
========================================================================================== MenuSelectResponser.java(处理菜单选择的类): package com.liu.Information; import com.liu.Information.Face; import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.File; 
import java.io.FileReader; 
import java.net.URL; import javax.swing.JFileChooser; 
import javax.swing.JOptionPane; 
public class MenuSelectResponser implements ActionListener { static String path=PathToSave.getHeihei();// 默认路径为d盘根目录,类变量不是定义在方法中的,static类型的变量不能改变 //要得到FileTree.java里边的filepath,则必须把它传过来而不是把path传过去 public void actionPerformed(ActionEvent e) { 
JFileChooser fc = new JFileChooser(); String keyword = Face.input.getText(); if (e.getSource() == Face.input) { 
try { 
if (keyword == null || keyword.equals(""))// 如果是空,则返回 
return; 
// 用不同的引擎有不同的反应,如果用google的那么就会下载两次页面(大概是由于google用了ajax的缘故) 
URL url = new URL("http://www.baidu.com/s?wd=" + keyword); 
Face.browser.setURL(url); 
//System.out.println("得到的路径是:"+path); 
} catch (Exception ex) { 
System.out.println(ex); 

} else if (e.getSource() == Face.submit) { 
try { 
if (keyword == null || keyword.equals(""))// 如果是空,则返回 
return; 
// 用不同的引擎有不同的反应,如果用google的那么就会下载两次页面(大概是由于google用了ajax的缘故) 
URL url = new URL("http://www.baidu.com/s?wd=" + keyword); 
Face.browser.setURL(url); 
System.out.println(path); 
//System.out.println("得到的submit路径是:"+path); 
} catch (Exception ex) { 
System.out.println(ex); 

} else if (e.getSource() == Face.open) { 
if (fc.showOpenDialog(Face.browser) == JFileChooser.APPROVE_OPTION) { 
File file = fc.getSelectedFile(); 
try { 
FileReader fr = new FileReader(file); 
Face.browser.setURL(file.toURL());// 将文件目录转换成URL地址 
fr.close(); 
} catch (Exception exp) { 
System.err.println("无法打开: " + file); 


} else if (e.getSource() == Face.exit) { 
// System.exit(0);,用下边的方式来代替直接退出 
int opt = JOptionPane.showConfirmDialog(Face.f, "真的要退出吗?", 
"提示!", JOptionPane.YES_NO_CANCEL_OPTION, 
JOptionPane.INFORMATION_MESSAGE); if (opt == JOptionPane.YES_OPTION) { 
System.exit(0); 

} else if (e.getSource() == Face.selectpath) { 
// 在这里的时候应该可以打开一个对话框,然后把这个对话框的路径得到,传递给path,Handler类里的path就是这个类里的path 
// 如果没有点击这个选项,那if-else里else的path默认为d:根目录,否则为选择的path 
//new PathToSave();// 这个要能把选择的路径作为参数返回 
//new FileTree().show(true); 
// JFileChooser directory_chooser=new JFileChooser(); 
// directory_chooser.showOpenDialog(Handler.browser); 
new PathToSave(); 
System.out.println(path); } else if (e.getSource() == Face.index) { 
try { 
Runtime.getRuntime().exec( 
"cmd.exe /c start http://www.prometheusfire.cn/"); 
} catch (Exception exp) { 
exp.printStackTrace(); 
} } else if (e.getSource() == Face.about) { 
// 可以在这里创建另外一个类的实例,而这个实例是专门用来显示“关于”的! 
new About(); 

}// end of method actionPerformed }// end of class 
现在就是在类文件MenuSelectResponser.java中得到的path=PathToSave.getHeihei();总是在第一个类文件PathToSave.java中没有初始化默认为null的static String heihei。 我怎么样才能正确地把路径参数传递过去呢? 

解决方案 »

  1.   

    MenuSelectResponser.java中的path不要了,所有用到path的地方都改为直接调用PathToSave.getHeihei()
      

  2.   


    还是不行啊,参数带不出PathToSave.java这个类文件。
      

  3.   

    你在PathToSave.java中把path设成static又不初始化,
    你这种调用方式并没有给heihei赋值,因为你这样只是直接访问类的静态部分,
    而在事件没被触发前你这个静态部分一直是null的,所以就出现了这个问题
      

  4.   

    谢谢兄台,这个参数传递的问题解决了,又碰到了一个问题:windows系统的文件目录格式和java的有出入,比如得到的路径是C:\save\temp,于是在java里边保存的文件名就成了savetemp******.html。。这怎么解决?