簡體   English   中英

我如何以小程序和應用程序的形式運行某些內容?

[英]How do I run something as an applet and application?

我正在從事這個項目,我需要它作為小程序和應用程序運行。 這就是我所擁有的,但是由於無法在互聯網上找到任何東西,所以我堅持去哪里。 有沒有資源或有人可以給我一些快速建議?

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()方法,事情可能會變得棘手...

更重要的是:小程序和應用程序之間處理資源的方式不同。

處理applet中的文件(例如,使用FileInputStream )可能會帶來安全隱患,並且在某些情況下(例如,當applet嵌入到網站中時)顯然不起作用。 (另請參閱小程序可以做什么和不能做什么 )。

相反,當將其作為應用程序運行時,調用getDocumentBase()沒有任何意義。 應用程序根本就沒有“文檔庫”。


但是,可以編寫一個可以顯示為小程序或應用程序的程序。 然后,主要區別將在於是將主JPanel放置在JApplet還是JFrame ,以及如何讀取數據。

假設相應的文件位於類路徑中,則一種讀取適用於applet和應用程序的數據的方法是通過getClass().getResourceAsStream("file.txt")

我猶豫了一下,是否應該針對主要問題發布示例,還是應該修改您的代碼以使其正常工作。 我都會做:

這是可以作為Applet或應用程序執行的示例。 它將讀取並顯示“ sample.jpg”。 (目前,基本上,該文件應該與“ .class-file位於同一目錄中。”關於資源處理,類路徑和流處理的更多詳細信息不在此答案的范圍內)

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");
    }
}


而且,這里的內容與原始代碼還有一些距離。 但是,我強烈建議盡可能地考慮實際的應用程序邏輯。 例如,你的主GUI組件應該再不是小應用程序本身,而是一個JPanel 不應直接通過FileInputStream或URL從文檔庫中讀取資源,而只能從InputStreams讀取資源。 這基本上是您發布的代碼, 只需進行最少的修改即可使其作為applet或應用程序運行

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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM