1,什么是jnlp:
java network launch protocol(java网络发布协议)。是保留applet的优点的前提下,通过一个jnlp程序,你可以在客户机上下载和安装单机版的java应用程序。
jnlp应用程序可以在运行时从因特网上动态下载资源,并且能够在用户连接到因特网的情况下,自动检查程序的版本。
2,FileChooser Test .java:
//: gui/jnlp/JnlpFileChooser.java
// Opening files on a local machine with JNLP.
// {Requires: javax.jnlp.FileOpenService;
// You must have javaws.jar in your classpath}
// To create the jnlpfilechooser.jar file, do this:
// cd ..
// cd ..
// ut
package gui.jnlp;
import javax.jnlp.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class JnlpFileChooser extends JFrame {
private JTextField fileName = new JTextField();
private JButton
open = new JButton("Open"),
save = new JButton("Save");
private JEditorPane ep = new JEditorPane();
private JScrollPane jsp = new JScrollPane();
private FileContents fileContents;
public JnlpFileChooser() {
JPanel p = new JPanel();
open.addActionListener(new OpenL());
p.add(open);
save.addActionListener(new SaveL());
p.add(save);
jsp.getViewport().add(ep);
add(jsp, BorderLayout.CENTER);
add(p, BorderLayout.SOUTH);
fileName.setEditable(false);
p = new JPanel();
p.setLayout(new GridLayout(2,1));
p.add(fileName);
add(p, BorderLayout.NORTH);
ep.setContentType("text");
save.setEnabled(false);
}
class OpenL implements ActionListener {
public void actionPerformed(ActionEvent e) {
FileOpenService fs = null;
try {
fs = (FileOpenService)ServiceManager.lookup(
"javax.jnlp.FileOpenService");
} catch(UnavailableServiceException use) {
throw new RuntimeException(use);
}
if(fs != null) {
try {
fileContents = fs.openFileDialog(".",
new String[]{"txt", "*"});
if(fileContents == null)
return;
fileName.setText(fileContents.getName());
ep.read(fileContents.getInputStream(), null);
} catch(Exception exc) {
throw new RuntimeException(exc);
}
save.setEnabled(true);
}
}
}
class SaveL implements ActionListener {
public void actionPerformed(ActionEvent e) {
FileSaveService fs = null;
try {
fs = (FileSaveService)ServiceManager.lookup(
"javax.jnlp.FileSaveService");
} catch(UnavailableServiceException use) {
throw new RuntimeException(use);
}
if(fs != null) {
try {
fileContents = fs.saveFileDialog(".",
new String[]{"txt"},
new ByteArrayInputStream(
ep.getText().getBytes()),
fileContents.getName());
if(fileContents == null)
return;
fileName.setText(fileContents.getName());
} catch(Exception exc) {
throw new RuntimeException(exc);
}
}
}
}
public static void main(String[] args) {
JnlpFileChooser fc = new JnlpFileChooser();
fc.setSize(400, 300);
fc.setVisible(true);
}
} ///:~
3,用于启动的jnlp文件:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec = "1.0+"
codebase="file:E:/myeclpse6.0/thinkingjava/bin/gui/jnlp"
href="filechooser.jnlp">
<information>
<title>FileChooser demo application</title>
<vendor>Mindview Inc.</vendor>
<description>
Jnlp File chooser Application
</description>
<description kind="short">
Demonstrates opening, reading and writing a text file
</description>
<icon href="mindview.gif"/>
<offline-allowed/>
</information>
<resources>
<j2se version="1.3+"
href="http://java.sun.com/products/autodl/j2se"/>
<jar href="jnlpfilechooser.jar" download="eager"/>
</resources>
<application-desc
main-class="gui.jnlp.JnlpFileChooser"/>
<security><all-permisssion><security>
</jnlp>
4,文件需要通过以下命令打成jar包:jar cvf gui/jnlp/jnlpfilechooser.jar gui/jnlp/*.class
配置文件的 codebase指明jar文件和jnlp文件的目录本地或服务器的目录。
5,使用introspector(内省器)抽取beaninfo
java的设计者希望能提供一个标准的工具,不仅要使用bean用起来简单,而且对于创建复杂的bean也能提供一个标准的
方法。这个工具就是IntroSpector类,这个类最重要的就是静态的getBeanInfo()方法,向这个方法传递一个Class对象引用,它能够完全侦测这个类,然后返回一个BeanInfo对象,通过这个对象得到Bean的属性、方法、事件。
//: gui/BeanDumper.java
// Introspecting a Bean.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.lang.reflect.*;
import static net.mindview.util.SwingConsole.*;
public class BeanDumper extends JFrame {
private JTextField query = new JTextField(20);
private JTextArea results = new JTextArea();
public void print(String s) { results.append(s + "\n"); }
public void dump(Class<?> bean) {
results.setText("");
BeanInfo bi = null;
try {
bi = Introspector.getBeanInfo(bean, Object.class);
} catch(IntrospectionException e) {
print("Couldn't introspect " + bean.getName());
return;
}
for(PropertyDescriptor d: bi.getPropertyDescriptors()){
Class<?> p = d.getPropertyType();
if(p == null) continue;
print("Property type:\n " + p.getName() +
"Property name:\n " + d.getName());
Method readMethod = d.getReadMethod();
if(readMethod != null)
print("Read method:\n " + readMethod);
Method writeMethod = d.getWriteMethod();
if(writeMethod != null)
print("Write method:\n " + writeMethod);
print("====================");
}
print("Public methods:");
for(MethodDescriptor m : bi.getMethodDescriptors())
print(m.getMethod().toString());
print("======================");
print("Event support:");
for(EventSetDescriptor e: bi.getEventSetDescriptors()){
print("Listener type:\n " +
e.getListenerType().getName());
for(Method lm : e.getListenerMethods())
print("Listener method:\n " + lm.getName());
for(MethodDescriptor lmd :
e.getListenerMethodDescriptors() )
print("Method descriptor:\n " + lmd.getMethod());
Method addListener= e.getAddListenerMethod();
print("Add Listener Method:\n " + addListener);
Method removeListener = e.getRemoveListenerMethod();
print("Remove Listener Method:\n "+ removeListener);
print("====================");
}
}
class Dumper implements ActionListener {
public void actionPerformed(ActionEvent e) {
String name = query.getText();
Class<?> c = null;
try {
c = Class.forName(name);
} catch(ClassNotFoundException ex) {
results.setText("Couldn't find " + name);
return;
}
dump(c);
}
}
public BeanDumper() {
JPanel p = new JPanel();
p.setLayout(new FlowLayout());
p.add(new JLabel("Qualified bean name:"));
p.add(query);
add(BorderLayout.NORTH, p);
add(new JScrollPane(results));
Dumper dmpr = new Dumper();
query.addActionListener(dmpr);
query.setText("frogbean.Frog");
// Force evaluation
dmpr.actionPerformed(new ActionEvent(dmpr, 0, ""));
}
public static void main(String[] args) {
run(new BeanDumper(), 600, 500);
}
} ///:~