Java 如何以小程序和应用程序的形式运行某些东西?

Java 如何以小程序和应用程序的形式运行某些东西?,java,applet,Java,Applet,我在这个项目上工作,我需要它作为一个小程序和应用程序运行。这就是我所拥有的,但我坚持要去哪里,因为我在互联网上找不到任何东西。有没有什么资源或者有没有人能给我一些快速的建议 public class Project extends JApplet { public void init() { try { URL pictureURL = new URL(getDocumentBase(), "sample.jpg"); myPicture = Imag

我在这个项目上工作,我需要它作为一个小程序和应用程序运行。这就是我所拥有的,但我坚持要去哪里,因为我在互联网上找不到任何东西。有没有什么资源或者有没有人能给我一些快速的建议

public class Project extends JApplet {

public void init() {

    try {
        URL pictureURL = new URL(getDocumentBase(), "sample.jpg");
        myPicture = ImageIO.read(pictureURL);
        myIcon = new ImageIcon(myPicture);
        myLabel = new JLabel(myIcon);
    } catch (Exception e) {
        e.printStackTrace();
    }
    add(label, BorderLayout.NORTH);

    add(bio);
    add(bio, BorderLayout.CENTER);

    pane.add(play);
    getContentPane().add(pane, BorderLayout.SOUTH);
    play.addActionListener(new  ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try{
                FileInputStream FIS = new FileInputStream("sample.mp3");
                player = new Player (FIS);
                player.play();
            } catch (Exception e1) {
                e1.printStackTrace();
            }}});
}

public static void main(String args[]) {
    JFrame frame = new JFrame("");
    frame.getContentPane().add();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.show();
}

private JPanel pane = new JPanel();
private TextArea bio = new TextArea("Bio");
private JButton play = new JButton("Play");
private Image myPicture;
private ImageIcon icon;
private JLabel label;
private Player player;

}

当尝试以小程序和应用程序的形式运行某个程序时,有几个注意事项

小程序有一个必须遵守的特定规则。可以将小程序添加到
JFrame
的内容窗格中,并手动调用
init()
,但一般来说,如果小程序希望调用其
start()
stop()
方法,事情可能会变得棘手

更重要的是:小程序和应用程序处理资源的方式不同

处理小程序中的文件(例如,使用
文件输入流
)可能会带来安全隐患,并且在某些情况下(例如,当小程序嵌入网站时)显然不起作用。(另见附件)

相反,当作为应用程序运行时,调用
getDocumentBase()
没有意义。应用程序根本没有“文档库”


尽管如此,还是可以编写一个可以显示为小程序或应用程序的程序。然后,主要区别在于主
JPanel
是放在
JApplet
还是放在
JFrame
中,以及如何读取数据

读取适用于小程序和应用程序的数据的一种方法是通过
getClass().getResourceAsStream(“file.txt”)
,前提是相应的文件位于类路径中

我犹豫了一会儿,是应该针对主要问题发布一个示例,还是应该修改您的代码以使其正常工作。我将两者兼而有之:

下面是一个可以作为小程序或应用程序执行的示例。它将读取并显示“sample.jpg”。(该文件目前基本上应“与.class文件位于同一目录中”。有关资源处理、类路径和流处理的更多详细信息超出了本回答的范围)



这里有一些东西仍然有点接近您的原始代码。但是,我强烈建议尽量考虑实际的应用程序逻辑。例如,您的主要GUI组件应该不是小程序本身,而是一个
JPanel
。不应通过文档库中的
FileInputStream
s或URL直接读取资源,而应仅从
inputstream
读取资源。这基本上就是您发布的代码,只需进行最少的修改即可使其作为小程序或应用程序运行:


@Marco13不用担心,这就是为什么如果你相信编辑有帮助,你可以选择。我已经相信你的答案足够令人满意,因此我选择了答案。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class AppletOrApplicationExample extends JApplet
{
    @Override
    public void init()
    {
        add(new AppletOrApplicationMainComponent());
    }

    public static void main(String args[])
    {
        JFrame frame = new JFrame("");
        frame.getContentPane().add(new AppletOrApplicationMainComponent());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

class AppletOrApplicationMainComponent extends JPanel
{
    public AppletOrApplicationMainComponent()
    {
        super(new BorderLayout());

        InputStream stream = getClass().getResourceAsStream("sample.jpg");
        if (stream == null)
        {
            add(new JLabel("Resource not found"), BorderLayout.NORTH);
        }
        else
        {
            try
            {
                BufferedImage image = ImageIO.read(stream);
                add(new JLabel(new ImageIcon(image)), BorderLayout.NORTH);
            }
            catch (IOException e1)
            {
                add(new JLabel("Could not load image"), BorderLayout.NORTH);
            }
        }

        JTextArea textArea = new JTextArea("Text...");
        add(textArea, BorderLayout.CENTER);

        JButton button = new JButton("Button");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                doSomething();
            }
        });
        add(button, BorderLayout.SOUTH);
    }

    private void doSomething()
    {
        System.out.println("Button was clicked");
    }
}
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Module5Assignment2 extends JApplet
{
    public void init()
    {
        try
        {
            InputStream stream = getClass().getResourceAsStream("sample.jpg");
            if (stream == null)
            {
                System.out.println("Resource not found");
            }
            else
            {
                myPicture = ImageIO.read(stream);
                icon = new ImageIcon(myPicture);
                label = new JLabel(icon);
                add(label, BorderLayout.NORTH);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        add(bio);
        add(bio, BorderLayout.CENTER);

        pane.add(play);
        getContentPane().add(pane, BorderLayout.SOUTH);
        play.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    FileInputStream FIS = new FileInputStream("sample.mp3");
                    // player = new Player (FIS);
                    // player.play();
                }
                catch (Exception e1)
                {
                    e1.printStackTrace();
                }
            }
        });
    }

    public static void main(String args[])
    {
        JFrame frame = new JFrame("");
        // ******PRETTY SURE I NEED TO ADD SOMETHING HERE*************
        Module5Assignment2 contents = new Module5Assignment2();
        frame.getContentPane().add(contents);
        contents.init();
        // *************************************************************

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.show();
    }

    private JPanel pane = new JPanel();
    private TextArea bio = new TextArea(
        "This is the bio of Christian Sprague; he doesn't like typing things.");
    private JButton play = new JButton("Play");
    private Image myPicture;
    private ImageIcon icon;
    private JLabel label;
    // private Player player;

}