NetBeans GUI builder cannot find SwingX classes

2k views Asked by At

I've been thrown into an existing software development project that is using Maven in a NetBeans Java project.

I've fetched the source from the blessed git repo into a freshly installed NetBeans 8. If I build and run it, it runs. :-)

I have to edit the GUI of the program which is created with the NetBeans GUI generator. If I try to open the GUI editor, it always marks some components that extends JXPanel as invalid, because of the following error:

java.lang.NoClassDefFoundError: org/jdesktop/swingx/JXPanel ... caused by java.lang.ClassNotFoundException: org.jdesktop.swingx.JXPanel

I simply do not understand it – the files swingx-1.6.jar and swingx-beaninfo-1.6.jar are in the Dependencies section of the project (without "!"), I've added them to Libraries Manager, and I've added them to Palette. The program runs, but why, why, why can't NetBeans GUI Editor find the classes?

What am I doing wrong?

The following is an excerpt from pom.xml:

<dependency>
    <groupId>org.jdesktop</groupId>
    <artifactId>swingx</artifactId>
    <version>1.6</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/swingx-1.6.jar</systemPath>
</dependency>
<dependency>
    <groupId>org.jdesktop</groupId>
    <artifactId>swingx.beaninfo</artifactId>
    <scope>system</scope>
    <version>1.6</version>
    <systemPath>${basedir}/lib/swingx-beaninfo-1.6.jar</systemPath>
</dependency>
2

There are 2 answers

0
Kurtibert On BEST ANSWER

I got it fixed now – thanks to @Asprise Support, who pushed me into the right direction.

The problem seems to be that matisse cannot handle the <systemPath>${basedir}/... entries in pom.xml indeed.

So, the only thing one has to do is to load the dependencies from a repository. If they are already in some repository: Great. If not, create your own local one and refer to it:

  1. Create a repository directory in your project, eg maven-repo
  2. Deploy the jars into it: mvn deploy:deploy-file -Durl=file://<absolute-path-to-repo> -Dfile=<path-to-jar> -DgroupId=<groupId-from-pom.xml> -DartifactId=<artifactId-from-pom.xml> -Dpackaging=jar -Dversion=<version-from-pom.xml>
  3. Add the new repository to pom.xml:

    <repositories>
        <repository>
            <id>someGreatName</id>
            <url>file://${basedir}/theNameOfYourRepositoryFolder</url>
        </repository>
    </repositories>
    

(The last two steps come from https://devcenter.heroku.com/articles/local-maven-dependencies)

  1. Just to be sure, empty the local Maven cache, located in ~/.m2/repository or C:\Users\<yourUserName>\.m2\repository
  2. Launch the application to let Maven download all the dependencies.

Now, Matisse should work – it doesn't understand the new ${basedir} in the pom.xml either, but Maven does, and Matisse gets the dependencies from Maven's cache afterwards (imho).

3
Scanner.js Receipt Invoice OCR On

I'd suggest you use swingx from central maven repository instead of your local copy - I suspect there is a bug or the GUI editor can not resolve ${basedir}. Here is my setup and it works well:

<dependencies>
    <dependency>
        <groupId>org.swinglabs.swingx</groupId>
        <artifactId>swingx-all</artifactId>
        <version>1.6.5</version>
    </dependency>
</dependencies>

and the corresponding Java class:

public class NewJFrame extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public NewJFrame() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

    jXPanel1 = new org.jdesktop.swingx.JXPanel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jXPanel1.setBackground(new java.awt.Color(153, 204, 255));

    javax.swing.GroupLayout jXPanel1Layout = new javax.swing.GroupLayout(jXPanel1);
    jXPanel1.setLayout(jXPanel1Layout);
    jXPanel1Layout.setHorizontalGroup(
        jXPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 259, Short.MAX_VALUE)
    );
    jXPanel1Layout.setVerticalGroup(
        jXPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 171, Short.MAX_VALUE)
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jXPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(131, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jXPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(118, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>//GEN-END:initComponents

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private org.jdesktop.swingx.JXPanel jXPanel1;
// End of variables declaration//GEN-END:variables

}