3

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>
dic19
  • 17,821
  • 6
  • 40
  • 69
Kurtibert
  • 638
  • 1
  • 5
  • 16
  • +1. I've experienced the same issue in the past and did not have the expertice to solve it :/ Now I remember this was one of the reasons I've started to hand-write my GUI. BTW I've replaced `maven` tag by`swing` because: 1) It's not a maven issue (your library actually works) 2) You'll probably get better help from Swing developers. – dic19 Nov 13 '14 at 20:41

2 Answers2

2

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

}

  • Hello @Asprise Support, I have tried your suggestion, but now, `org.jdesktop.swingx.editors.EnumPropertyEditor` cannot be found anymore. Has it been removed from SwingX? – Kurtibert Nov 23 '14 at 19:44
  • Hi @Kurtibert, it seems that class exists in 1.6.3, so you can use: org.swinglabs.swingx swingx-all 1.6.3 – Scanner.js Receipt Invoice OCR Nov 26 '14 at 06:19
  • No, I am sorry, there is no such class at that swingX, at least I didn't find any. I now got it fixed – I will post my solution here tomorrow. Thank you very much for your help, you pushed me into the right direction! :-) – Kurtibert Nov 26 '14 at 20:06
1

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).

Kurtibert
  • 638
  • 1
  • 5
  • 16