最近在做一个简单的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。 我怎么样才能正确地把路径参数传递过去呢?
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。 我怎么样才能正确地把路径参数传递过去呢?
解决方案 »
- 求教,怎么修改程序,在用户输入中输入,不要不需要显示排序前了,按下按钮排序,然后就可以排序,
- 可以在程序中调用jdk工具提供的命令吗?
- java自定义文件
- Java中可以通过编码进行视频压缩吗
- 占于流量的问题, 望高人解答
- 紧急求助!java如何通过socket发送16进制的数据包(在线等)
- 在Soap中:accessor 是什么意思啊!
- 读excel表结构问题,如何获得所有的sheet名称?
- 请问在java中怎么画直线?
- ***************Help.怎样在Applet中弹出一网页?***************
- 使用jfreechart画图问题
- 点击确定按钮,文本框里怎么不显示所要显示的内容啊?如果在jj类中调用jc类中的字符串s并显示,怎么操作啊?谢谢了!(jj.java及jc.java
还是不行啊,参数带不出PathToSave.java这个类文件。
你这种调用方式并没有给heihei赋值,因为你这样只是直接访问类的静态部分,
而在事件没被触发前你这个静态部分一直是null的,所以就出现了这个问题