【问题标题】:Why my program works on JFrame but not on JApplet?为什么我的程序可以在 JFrame 上运行,但不能在 JApplet 上运行?
【发布时间】:2015-04-24 09:28:29
【问题描述】:

我有一个 Java 项目(使用 Eclipse 开发),其中我使用了一些 Swing 组件。一开始,我使用 JFrame:我创建了一个继承自 JPanel (PanelTr) 的新类,在其中添加了我的 JLabels、JTextField 和 JButton,并在我的按钮上添加了一个 ActionListener,并将一个对象 PanelTr 添加到我的 JFrame 继承的类中。这是我的一段代码:

package gui;

public class PanelTr extends JPanel implements ActionListener {

    // Here I instantiate my JTextField and JButton used by ActionListener
    private JTextField textCap = new JTextField(20);
    private JButton submitButton = new JButton("Submit"); 

    public PanelTr() {

        // Here I add my JLabels and my layout manager

        submitButton.addActionListener(this);


}

    public void actionPerformed(ActionEvent evt)
    {
        if (evt.getSource()==submitButton)
        {
            JOptionPane.showMessageDialog(null,"DEBUG"); // Just to see if it is displayed
            String err = Analyzer.process(textCap.getText().toString()); // An analyzing process I use in my program
            if (err=="")
            {
                JOptionPane.showMessageDialog(null,"OK");
            }
            else
            {
                JOptionPane.showMessageDialog(null,err,"Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }   
}

还有我的 JFrame:

package gui;

public class FrameTr extends JFrame
{
    public FrameTr()
    {
        PanelFils ctn = new PanelFils(); //Conteneur
        setContentPane(ctn);
        ctn.setBackground(new Color(0,255,255));
        setTitle("Project");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String args[])
    {
        new FrameTr();
    }
}

在我的 Analyzer 类中,我使用了位于项目根文件夹中的几个 Excel 文件。

因此,使用此代码,我的程序在 Eclipse 上运行良好,当我将其导出到可运行的 jar 中时(我将 Excel 文件放在 .jar 文件的同一文件夹中)。

但现在我需要制作一个 Applet,它允许程序在 Web 浏览器上运行。所以我只用这段代码创建了一个新的基于 JApplet 的类:

package gui;

public class TestApplet extends JApplet{

    public void init()
    {
        PanelTr ctn = new PanelTr();
        setContentPane(ctn);
    }
}

当我在 Eclipse 上运行这个类时,会显示我的 debug JOptionPane,但在分析过程中,我的第一个 Excel 文件出现 FileNotFoundException。我试图将它移动到 src 文件夹,gui 文件夹,甚至 analysis 文件夹(我的 Analyzer 类),但仍然是这个 FileNotFoundException...

我还尝试在网页中运行我的程序,因此我导出为可运行的 jar(注意:我无法在启动配置中选择 TestApplet,因为它没有 main( ),所以我选择了 FrameTr)。我使用了标签:

<applet archive="app.jar" width="700" height="100" code="gui/TestApplet.class"/>

显示了我的窗格,但是当我单击按钮时,调试 JOptionPane 没有弹出

首先,我该如何解决 FileNotFound 问题?然后,为什么我的 JOptionPane 没有显示在我的网络浏览器上?

【问题讨论】:

  • 你是如何加载文件的?
  • 小程序在沙箱中运行,对您的计算机的访问权限有限。你确定它可以访问这些文件吗?
  • @MrWiggles 我用FileInputStream file = new FileInputStream(new File("Countries.xlsx")); 加载文件,然后我用Apache POI 处理它,它与JFrame 配合得很好。 :)
  • @TimB 在eclipse上我把文件放在根文件夹中,在我的网络服务器上,文件与jar在同一个文件夹中。
  • 确保Java Console 配置为显示。如果默认级别没有输出,提升级别再试一次。

标签: java eclipse swing jframe japplet


【解决方案1】:

小程序受到限制,无法访问文件系统(签名的小程序除外)。

如果您的 jar 中的文件,您可以将它们用作资源。而不是使用例如FileInputStream 使用this.getClass().getResourceAsStream("/Countries.xlsx")(Countries.xlsx 应该在根目录中)

【讨论】:

  • 我不能使用“this”,因为我没有从 Analyzer 实例化任何对象(没有构造函数)而且我所有的方法都是静态的,还有其他方法吗?
  • TestApplet.class.getResourceAsStream("/Countries.xlsx")
  • 它在我的网络浏览器中不起作用。我使用以下行替换了旧的“FileInputStream ...”:InputStream file = TestApplet.class.getResourceAsStream("/Countries.xlsx"); 并且没有结果...如何在 Eclipse 中测试它?
  • 查看xlxs文件的位置?它是否存在于您的类所在的同一个目录/包中?
【解决方案2】:

Java Applet 在客户端执行 - 它在使用网站的人的计算机上运行。它不在网络服务器上运行。

如果您在服务器中有文件,那么客户端将无法访问它们,除非您从您的网络服务器提供它们并通过 HTTP(S) 访问它们。

如果文件中的值是常量,那么您应该将文件放在 JAR 中并将它们作为 Applet 的一部分分发。

【讨论】:

  • 哦,我明白了,那我在做什么绝对没用!实际上,我从 5 个 Excel 文件中获得了一些静态资源,还有 1 个 Excel 文件用于我的结果。每次我为我的程序提供一个 URL 时,它都会通过我的 5 个静态文件对其进行分析,然后在我的结果 excel 文件中添加一行。所以实际上现在结果是“本地”而不是在服务器中生成的,所以没有意义!我说的对吗?
  • 是的,差不多就是这样。
  • 哇,谢谢你让我意识到,我已经浪费了一些时间,但至少我学到了一些东西!因此,如果我理解了,我必须从小程序连接到我的 Web 服务器(通过 HTTP/HTTPS)才能获取我的文件......该解决方案中的大问题是从服务器获取文件,然后推送到服务器,因为我在一个拥有大量防火墙、代理等的大社会工作。所以我想我必须找到另一个解决方案!那么JavaEE对我有用吗? (因为它是在服务器中执行的)
  • @Malik 可能。不过,对于 cmets 来说,这个问题太大了(甚至可能在这里作为一个问题问得太宽泛了)。你需要重新考虑你的架构,这是肯定的。
  • “所以如果我理解的话,我必须从小程序连接到我的 Web 服务器(通过 HTTP/HTTPS)才能获取我的文件......” 不是(确切地说)必然。可以将文件包含在小程序 Jar 中并以embedded-resource 的形式访问它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多