Hey all,

I have a JApplet that runs in browser and I can't get it to create a new JFrame popup when a button is clicked. It works fine in my IDE (Eclipse) but not when I upload it. Here's the code for the JFrame I'm trying to create:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.jdesktop.swingx.*;

public class SchedWind {

    private String selectedDate;
    private PHPHandler phpMain;
    private ResponseObj[] serverPHPresponse;
    private final JLabel hotStatus;

    public SchedWind() {
        hotStatus = new JLabel("Waiting for user...");
        serverPHPresponse = null;
        selectedDate = null;
        phpMain = new PHPHandler();
        showGUI();
    }

    public void showGUI() {
        final JFrame frame = new JFrame("Schedule");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(false);
        GridBagLayout gLayout = new GridBagLayout();
        frame.setLayout(gLayout);
        GridBagConstraints c = new GridBagConstraints();

        hotStatus.setForeground(Color.BLUE);
        hotStatus.setVerticalAlignment(JLabel.CENTER);
        hotStatus.setHorizontalAlignment(JLabel.CENTER);

        JLabel selectDayLabel = new JLabel("Please select day:");
        selectDayLabel.setOpaque(false);
        selectDayLabel.setPreferredSize(new Dimension(170,30));
        selectDayLabel.setHorizontalAlignment(JLabel.CENTER);
        selectDayLabel.setVerticalAlignment(JLabel.CENTER);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        frame.add(selectDayLabel, c);

        final JXDatePicker datePicker = new JXDatePicker();
        datePicker.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selectedDate = datePicker.getDate().toString();
                //System.out.println(selectedDate);
            }
        });
        c.gridx = 1;
        c.gridy = 0;
        frame.add(datePicker, c);

        JButton grabSched = new JButton("OK");
        c.gridx = 0;
        c.gridy = 1;
        c.anchor = GridBagConstraints.CENTER;
        c.insets = new Insets(20,10,0,0);
        grabSched.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(selectedDate == null) {
                    hotStatus.setText("Please enter a date.");
                    hotStatus.setForeground(Color.RED);
                }
                else {
                    hotStatus.setText("Contacting server...");
                    hotStatus.setForeground(Color.BLUE);
                    //System.out.println(selectedDate);
                    grabSchedFromServer();
                }
            }
        });
        frame.add(grabSched, c);

        JButton cancel = new JButton("Cancel");
        c.gridx = 1;
        c.gridy = 1;
        frame.add(cancel, c);
        cancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                frame.dispose();
            }
        });


        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 2;
        frame.add(hotStatus, c);

        frame.pack();
        frame.setVisible(true);
    }

    protected void grabSchedFromServer() {
        String[] conArr = selectedDate.split(" ");
        String mo = conArr[1];
        String con = conArr[5] + "-";
        if(mo.equals("Jan"))
            con += "01-";
        else if(mo.equals("Feb"))
            con += "02-";
        else if(mo.equals("Mar"))
            con += "03-";
        else if(mo.equals("Apr"))
            con += "04-";
        else if(mo.equals("May"))
            con += "05-";
        else if(mo.equals("Jun"))
            con += "06-";
        else if(mo.equals("Jul"))
            con += "07-";
        else if(mo.equals("Aug"))
            con += "08-";
        else if(mo.equals("Sep"))
            con += "09-";
        else if(mo.equals("Oct"))
            con += "10-";
        else if(mo.equals("Nov"))
            con += "11-";
        else if(mo.equals("Dec"))
            con += "12-";
        con += conArr[2];
        con += "@BREAK";
        con += con.substring(0,con.indexOf("@BREAK"));
        VideoDate sel = new VideoDate(con);
        serverPHPresponse = phpMain.sendPOSTReadRequest(sel);
        hotStatus.setText("Query successful!");
        hotStatus.setForeground(Color.GREEN);
        //System.out.println(serverPHPresponse[0].printPretty());
        if(serverPHPresponse[0].blank) {
            hotStatus.setText("No video requests were found for the selected day.");
            hotStatus.setForeground(Color.BLACK);
        }
        else {
            reportWind pop = new reportWind(serverPHPresponse);
            pop.toString();
        }
    }
}

And it's triggered by this in another class:

seeSched.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SchedWind main = new SchedWind();
                main.toString();
            }
        });

The thing is, if I try and get it to open an extremely simple JFrame with nothing in it, it works. Can anyone help?

Thanks!

Dani AI

Generated

Short summary and what actually fixed it
The JFrame never appeared because the SwingX class used by your dialog (JXDatePicker) was missing at runtime — the plugin threw a NoClassDefFoundError and the AWT event thread quietly failed. That error means the class was available at compile time but not on the applet/plugin runtime classpath. (docs.w3cub.com) This matches ’s final diagnosis and ’s hint about the archive/classpath.

Quick, practical checks and fixes

  • Verify the Java Console stack trace (you already did) and locate the class name in the error. Missing third-party jars are the most common cause.
  • Ensure the browser/plugin can actually reach the library jar. For an HTML <applet> use a comma-separated archive list (not multiple separate archive params). For mixed <object>/<embed> markup prefer the plugin-specific param names (for example java_archive) so the Java plug-in picks them up. (docs.oracle.com)

Example (HTML snippets)
Use a single archive attribute (comma-separated):

<applet code="VideoApplet" width="800" height="600" archive="VideoApplet.jar,swingx-all-1.6.3.jar">

Or, when using OBJECT/EMBED mapping, pass the jar list with java_archive. (See Oracle docs above for cross-browser guidance.) (docs.oracle.com)

If you prefer one distributable JAR
Do NOT nest swingx.jar inside VideoApplet.jar as a JAR file — the standard class loader will not load a JAR that's embedded inside another JAR unless you provide a special loader or use an executable/nested-jar format; the usual solution is to produce an “uber”/shaded jar (or list both jars in archive). Tools: Maven Shade, Gradle Shadow, or unpack-and-repack with jar (watch for resource/class name collisions). (docs.spring.io)

Final notes (security & long-term)
If the applet needs elevated permissions or you get manifest/permission warnings, sign the JAR(s) and add the appropriate manifest attributes (Permissions, Codebase) per the Java deployment guide. Also be aware that modern Chrome removed NPAPI-based Java plugin support (Chrome 45 / Sept 2015), so browser-side applets are effectively legacy — consider JNLP/OpenWebStart or converting to a standalone app if targeting current browsers. (docs.oracle.com)

Tying back: correctly found it was a packaging/classpath issue; ’s archive advice was the right direction; ’s security suggestion is useful in other cases but not the root cause here.

Recommended Answers

All 18 Replies

Are there any error messages in the browser's java console?

None!

What is the difference between the JFrame that works and the one that doesn't?

Strange there is no error message for the one that does not work.

I got it! It had to do with the fact that I used an external library for the JXDatePicker and that wasn't exporting correctly into the JAR. Derp.

I am unsure about this, However I assume that you maybe to some extent using Entities that basically override the Java Runtime Environment default policy.

Try running the JFrame directly with security features.

java -Djava.security.manager Executable

If that works, then we can consider it to be other factors . However this is just a guess.

I'll try messing with the security, but this time I correctly packaged the library into the JAR and it still didn't work correctly. If it's any help, I'm trying to package in the SwingX libraries.

it still didn't work correctly

Can you explain what it does do? And how that differs from being "correct".

It works fine in Eclipse, but when I export it to a normal JAR file and upload it to my website and click the button to create the JFrame popup, nothing happens. No error, no exception, nothing. This happens even after I included the library in the JAR I created. If I don't reference SwingX (the library causing all this trouble) then it works fine.

I think I found the issue but I don't know what to do. When I click the button in my applet when it's in the web browser, I actually get this error in the java console:

Exception in thread "AWT-EventQueue-2" java.lang.NoClassDefFoundError: org/jdesktop/swingx/JXDatePicker
    at VideoApplet$1.actionPerformed(VideoApplet.java:44)
    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.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$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)
Caused by: java.lang.ClassNotFoundException: org.jdesktop.swingx.JXDatePicker
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 36 more

You need to put the class referenced in the error message on the classpath so the java program can find it.
The archive attribute of the <applet tag can take more than one jar file

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry exported="true" kind="lib" path="lib/swingx-all-1.6.3.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

That's the contents of my .classpath file right now, isn't swingx already included?

How does what you just posted relate to the applet tag in the html page the browser is reading?

It doesn't, I think the problem is that the java console itself can't find the correct class even though the JAR is in the class path. Regardless, here's the HTML code I use on the page containing the applet:

<body>
    <table width=100% height=100%>
    <tr>
    <td style="text-align: center; vertical-align: middle;">
    <object type="application/x-java-applet" height="600" width="800">
    <param name="code" value="VideoApplet" />
    <param name="archive" value="VideoApplet.jar" />
    <param name="archive" value="lib/swingx-all-1.6.3.jar" />
    Applet failed to run.  No Java plug-in was found!
    </object>
    </td>
    </tr>
    </table>
</body>

I tried adding the class but I still get this:

Exception in thread "AWT-EventQueue-2" java.lang.NoClassDefFoundError: org/jdesktop/swingx/JXDatePicke

Try using the <applet tag.

Part of this project requires valid HTML5, and the applet tag is deprecated. Is there any other way?

Try using it only for testing to see if it works.

Same error. In console I get this:

Exception in thread "AWT-EventQueue-4" java.lang.NoClassDefFoundError: org/jdesktop/swingx/JXDatePicker

here's what my HTML file looks like:

<body>
    <table width=100% height=100%>
    <tr>
    <td style="text-align: center; vertical-align: middle;">



    <!--<object type="application/x-java-applet" height="600" width="800">
    <param name="code" value="VideoApplet" />
    <param name="archive" value="VideoApplet.jar" />
    Applet failed to run.  No Java plug-in was found!
    </object>-->



    <applet code="VideoApplet.class" width="800" height="600" archive="VideoApplet.jar", "swingx-all-1.6.3.jar">
    Java applet
    </applet>
    </td>
    </tr>
    </table>
</body>

Both VideoApplet.jar and swingx-all-1.6.3.jar are on my server in the same directory.

Try swapping the positions of the jar file references to see if the syntax for the archive attribute is correct.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.