我无法从另一个类调用“如何与桌面类集成”,这本质上是一个帮助按钮,按下时调用Desktop类并显示我的JavaDoc。以下是我正在使用的帮助按钮的代码:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Gui extends JFrame {
private static final long serialVersionUID = 1L;
private JButton autoButton;
private FlowLayout layout;
public Gui() {
super("Help");
layout = new FlowLayout(FlowLayout.CENTER);
setLayout(layout);
setDefaultCloseOperation(3);
setSize(300, 300);
setLocationRelativeTo(null);
autoButton = new JButton("Help");
add(autoButton);
autoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DesktopDemo.onLaunchBrowser(e);
}
});
}
public static void main(String... args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Gui().setVisible(true);
}
});
}
}
以下是我用来打开JavaDoc的“如何与桌面类集成”。我只包含了一些细微的变化,主要是将一些变量更改为“静态”。原始桌面演示位于以下Oracle Java文档页面here的底部。 这是我的版本:
/*
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* DesktopDemo.java
*
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class DesktopDemo extends JFrame {
JButton btnLaunchApplication = new JButton("Launch Application");
JButton btnLaunchBrowser = new JButton("Launch Browser");
JButton btnLaunchEmail = new JButton();
JRadioButton rbEdit = new JRadioButton("Edit");
JRadioButton rbOpen = new JRadioButton("Open", true);
JRadioButton rbPrint = new JRadioButton("Print");
JTextField txtBrowserURI = new JTextField();
JTextField txtMailTo = new JTextField();
JTextField txtFile = new JTextField();
ButtonGroup bgAppAction = new ButtonGroup();
JLabel lblMailRecipient = new JLabel("E-mail:");
JLabel lblBrowserUri = new JLabel("URI:");
JLabel lblFile = new JLabel("File:");
JButton btnFile = new JButton("...");
JLabel emptyLabel = new JLabel(" ");
JPanel conLeft = new JPanel();
JPanel conCenter = new JPanel();
JPanel conRight = new JPanel();
JFileChooser fc = new JFileChooser();
File file;
private static Desktop desktop;
private Desktop.Action action = Desktop.Action.OPEN;
/**
* Creates new form DesktopDemo
*/
public DesktopDemo() {
// init all gui components
initComponents();
// disable buttons that launch browser, email client,
// disable buttons that open, edit, print files
disableActions();
// before any Desktop APIs are used, first check whether the API is
// supported by this particular VM on this particular host
if (Desktop.isDesktopSupported()) {
desktop = Desktop.getDesktop();
// now enable buttons for actions that are supported.
enableSupportedActions();
}
//loadFrameIcon();
setResizable(false);
}
public static void main(String args[]) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DesktopDemo().setVisible(true);
}
});
}
/** Create and show components
*/
private void initComponents() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("DesktopDemo");
txtBrowserURI.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onLaunchBrowser(null);
}
});
btnLaunchBrowser.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onLaunchBrowser(evt);
}
});
txtMailTo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onLaunchMail(null);
}
});
btnLaunchEmail.setText("Launch Mail");
btnLaunchEmail.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onLaunchMail(evt);
}
});
txtFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onLaunchDefaultApplication(null);
}
});
rbOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onOpenAction(evt);
}
});
rbEdit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onEditAction(evt);
}
});
rbPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onPrintAction(evt);
}
});
btnLaunchApplication.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onLaunchDefaultApplication(evt);
}
});
btnFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onChooseFile(evt);
}
});
Container conFrame = this.getContentPane();
bgAppAction.add(rbOpen);
bgAppAction.add(rbEdit);
bgAppAction.add(rbPrint);
// Components layouting
GroupLayout layout = new GroupLayout(conFrame);
conFrame.setLayout(layout);
layout.setAutoCreateContainerGaps(true);
layout.setAutoCreateGaps(true);
GroupLayout.SequentialGroup majorHGroup = layout.createSequentialGroup();
// Horizontal group
GroupLayout.ParallelGroup lblHGroup =
layout.createParallelGroup(GroupLayout.Alignment.LEADING);
lblHGroup.addComponent(lblBrowserUri, GroupLayout.Alignment.TRAILING);
lblHGroup.addComponent(lblMailRecipient, GroupLayout.Alignment.TRAILING);
lblHGroup.addComponent(lblFile, GroupLayout.Alignment.TRAILING);
GroupLayout.ParallelGroup txtFieldsHGroup =
layout.createParallelGroup(GroupLayout.Alignment.LEADING);
txtFieldsHGroup.addComponent(txtMailTo);
txtFieldsHGroup.addComponent(txtBrowserURI);
GroupLayout.SequentialGroup rbHGroup = layout.createSequentialGroup();
rbHGroup.addComponent(rbOpen);
rbHGroup.addComponent(rbEdit);
rbHGroup.addComponent(rbPrint);
txtFieldsHGroup.addGroup(rbHGroup);
GroupLayout.SequentialGroup fileHGroup = layout.createSequentialGroup();
fileHGroup.addComponent(txtFile);
fileHGroup.addComponent(btnFile);
txtFieldsHGroup.addGroup(fileHGroup);
GroupLayout.ParallelGroup btnHGroup =
layout.createParallelGroup(GroupLayout.Alignment.LEADING);
btnHGroup.addComponent(btnLaunchBrowser);
btnHGroup.addComponent(btnLaunchEmail);
btnHGroup.addComponent(btnLaunchApplication);
majorHGroup.addGroup(lblHGroup);
majorHGroup.addGroup(txtFieldsHGroup);
majorHGroup.addGroup(btnHGroup);
layout.setHorizontalGroup(majorHGroup);
// Vertical group
GroupLayout.SequentialGroup majorVGroup = layout.createSequentialGroup();
GroupLayout.ParallelGroup uriVGroup =
layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
uriVGroup.addComponent(lblBrowserUri);
uriVGroup.addComponent(txtBrowserURI);
uriVGroup.addComponent(btnLaunchBrowser);
GroupLayout.ParallelGroup mailVGroup =
layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
mailVGroup.addComponent(lblMailRecipient);
mailVGroup.addComponent(txtMailTo);
mailVGroup.addComponent(btnLaunchEmail);
GroupLayout.ParallelGroup rbVGroup =
layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
rbVGroup.addComponent(rbOpen);
rbVGroup.addComponent(rbEdit);
rbVGroup.addComponent(rbPrint);
GroupLayout.ParallelGroup fileVGroup =
layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
fileVGroup.addComponent(lblFile);
fileVGroup.addComponent(btnLaunchApplication);
fileVGroup.addComponent(txtFile);
fileVGroup.addComponent(btnFile);
majorVGroup.addGroup(uriVGroup);
majorVGroup.addGroup(mailVGroup);
majorVGroup.addGroup(rbVGroup);
majorVGroup.addGroup(fileVGroup);
layout.setVerticalGroup(majorVGroup);
pack();
}
/**
* Load the "desktop" icon into our frame window.
*/
/*
* Set the Desktop.Action to PRINT before invoking
* the default application.
*/
private void onPrintAction(ActionEvent evt) {
action = Desktop.Action.PRINT;
}
/**
* Set the Desktop.Action to EDIT before invoking
* the default application.
*/
private void onEditAction(ActionEvent evt) {
action = Desktop.Action.EDIT;
}
/**
* Set the Desktop.Action to OPEN before invoking
* the default application.
*/
private void onOpenAction(ActionEvent evt) {
action = Desktop.Action.OPEN;
}
/**
* Launch the default application associated with a specific
* filename using the preset Desktop.Action.
*
*/
private void onLaunchDefaultApplication(ActionEvent evt) {
String fileName = txtFile.getText();
File file = new File(fileName);
try {
switch(action) {
case OPEN:
desktop.open(file);
break;
case EDIT:
desktop.edit(file);
break;
case PRINT:
desktop.print(file);
break;
}
} catch (IOException ioe) {
//ioe.printStackTrace();
System.out.println("Cannot perform the given operation to the " + file + " file");
}
}
/**
* Launch the default email client using the "mailto"
* protocol and the text supplied by the user.
*
*/
private void onLaunchMail(ActionEvent evt) {
String mailTo = txtMailTo.getText();
URI uriMailTo = null;
try {
if (mailTo.length() > 0) {
uriMailTo = new URI("mailto", mailTo, null);
desktop.mail(uriMailTo);
} else {
desktop.mail();
}
} catch(IOException ioe) {
ioe.printStackTrace();
} catch(URISyntaxException use) {
use.printStackTrace();
}
}
/**
* Launch the default browser with the text provided by the
* user.
*
*/
public static void onLaunchBrowser(ActionEvent evt) {
String urlStr = "file:///C:/Users/howhowhows/workspace/OPTICS_DROP_MENU/doc/index.html";
URL url = null;
try {
url = new URL(urlStr);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URI uri = null;
try {
uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
desktop.browse(uri);
} catch(IOException ioe) {
System.out.println("The system cannot find the " + uri + " file specified");
//ioe.printStackTrace();
}
}
private void onChooseFile(ActionEvent evt) {
if (evt.getSource() == btnFile) {
int returnVal = fc.showOpenDialog(DesktopDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION){
file = fc.getSelectedFile();
txtFile.setText(file.getAbsolutePath());
}
}
}
/**
* Enable actions that are supported on this host.
* The actions are: open browser, open email client, and
* open, edit, and print files using their associated application
*/
private void enableSupportedActions() {
if (desktop.isSupported(Desktop.Action.BROWSE)) {
txtBrowserURI.setEnabled(true);
btnLaunchBrowser.setEnabled(true);
}
if (desktop.isSupported(Desktop.Action.MAIL)) {
txtMailTo.setEnabled(true);
btnLaunchEmail.setEnabled(true);
}
if (desktop.isSupported(Desktop.Action.OPEN)) {
rbOpen.setEnabled(true);
}
if (desktop.isSupported(Desktop.Action.EDIT)) {
rbEdit.setEnabled(true);
}
if (desktop.isSupported(Desktop.Action.PRINT)) {
rbPrint.setEnabled(true);
}
if (rbEdit.isEnabled() || rbOpen.isEnabled() || rbPrint.isEnabled()) {
txtFile.setEnabled(true);
btnLaunchApplication.setEnabled(true);
btnFile.setEnabled(true);
}
}
/**
* Disable all graphical components until we know
* whether their functionality is supported.
*/
private void disableActions() {
txtBrowserURI.setEnabled(false);
btnLaunchBrowser.setEnabled(false);
txtMailTo.setEnabled(false);
btnLaunchEmail.setEnabled(false);
rbEdit.setEnabled(false);
rbOpen.setEnabled(false);
rbPrint.setEnabled(false);
txtFile.setEnabled(false);
btnLaunchApplication.setEnabled(false);
btnFile.setEnabled(false);
}
}
而且,这是我得到的错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at DesktopDemo.onLaunchBrowser(DesktopDemo.java:383)
at Gui$1.actionPerformed(Gui.java:26)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
如果有人在那里知道我做错了什么,为什么我得到一个Null指针异常,请你发布你提出的代码和更改等等。请注意我是java的新手,所以你如果我问一个愚蠢的问题,可能需要有一些耐心。感谢您阅读此问题,我期待看到一些反馈。干杯,本。 C”,)
答案 0 :(得分:0)
NPE是由于以下原因
try {
desktop.browse(uri);
} catch(IOException ioe) {
System.out.println("The system cannot find the " + uri + " file specified");
//ioe.printStackTrace();
}
您正在DesktopDemo构造函数中初始化桌面,但onLaunchBrowser()是一个静态方法,因此桌面对象不会被实例化!