Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Applet hidden classnotfound exception

I'm developing an applet that behaves strangely: this is not the usual "I can't start my applet in the browser" problem, but something more subtle.

The applet consists into a jtabbedpane with 8 tabs, each of which does some data manipulation in the workflow, and the user has two buttons (back and forward) to cycle through tabs.

When I run it into the browser (latest chrome or firefox, but this doesn't matter) I notice a consistent slowdown when passing from the 7th to the 8th tab: in the latter I put a jtable with a custom tablemodel in that tab and in eclipse it runs just fine. A few debug steps later I notice that the jvm throws a classnotfoundexception for the class RateTableModel, which is my custom tablemodel. The odd thing is that even though I test the applet both in the IDE and as a self signed applet into the browser that exception is never thrown in any console. I verified everywhere: there are no empty catch blocks, every exception gets always its stackstrace printed and if I put the initialization code of my tablemodel in a try/catch block that exception never gets caught. The even funnier thing is that after a random amount of time the execution continues as if nothing happened (only in the IDE this time), whereas in the browser the GUI acts just like a normal exception: it messes everything up.

What I would like to ask is for any idea on why this happens.

The class RateTableModel is located in the package geotel.utils, where I have other classes I regularly instantiate before I have to load this one, and I verified that this class is present in the jar.

Details on the development (maybe for those who read this can be useful):

The applet is signed using the command

jarsigner -keystore keystore3 C:\GestioneOneri.jar me3

the applet is run from the following html file:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
            <title>Titolo</title>
    </head>
    <body>
        <script src="http://www.java.com/js/deployJava.js"></script>
        <script> 
            var attributes = {code:'geotel.gui.Login.class', 
                    archive:'GestioneOneri.jar,mysql-connector-java-5.1.20-bin.jar,poi-3.9-20121203.jar,forms-1.3.0.jar', 
                    width:1024, height:700} ;
            var parameters = {jnlp_href:'gestioneoneri.jnlp', portalUrl:'http://192.168.146.145:8080/GestioneOneriServlet', nomeUtente:'', numeroPratica:'', percorsoFileCalcoloOneri:"/", nomeFileCalcoloOneri:"calcoloOneri.xls"} ; 
            var version = '1.6' ;
            deployJava.runApplet(attributes, parameters, version);  
        </script>
        <noscript>This page requires JavaScript.</noscript>
    </body>
</html>

The JNLP file is the following:

<?xml version="1.0" encoding="UTF-8"?>
    <jnlp href="gestioneoneri.jnlp">
        <information>
            <title>Gestione Oneri Urbanistici</title>
            <vendor>Geotel soc. coop.</vendor>
            <offline-allowed />
        </information>
        <resources>
            <j2se version ="1.6+" initial-heap-size="128m" max-heap-size="1024m"
  href="http://java.sun.com/products/autodl/j2se" />
            <jar href="GestioneOneri.jar" main="true" />
        <jar href="mysql-connector-java-5.1.20-bin.jar"/>
        <jar href="poi-3.9-20121203.jar"/>
        <jar href="forms-1.3.0.jar"/>
        </resources>
        <applet-desc
            name="Gestione Oneri Urbanistici"
            main-class="geotel.gui.Login"
            width="1024"
            height="700"/>
    </jnlp>

The code that causes the ClassNotFoundException is the following: class DatiRatePanel

this.tm = new geotel.utils.RateTableModel(columnNames, oneriPratica, rate, rateizzazioniPreviste);

and the definition of the class RateTableModel is

public class RateTableModel extends AbstractTableModel

EDIT: after a few more debug steps, I found that in the debug view there is the situation in the screenshot Debug

I absolutely have no idea what those keys stand for, but if I keep pressing F5 (Step into) those keys go away, the very following step the execution continues and the classloader magically becomes able to find the class RateTableModel. How can I get rid of this?

Thank you!

EDIT2: I researched a bit on the keys icons in the Eclipse documentation, and it found out they are monitors on locked objects. As far as I know monitors appear where there are synchronized blocks of code, which I don't have here (and I'm sure those blocks aren't called). It's getting me mad...

EDIT3: I tried putting some printlns about how much time each instruction needed, following is the source code and the output. I don't understand why the times are "reset" (or so it seems) in print 2 and 4, it seems like there are more threads which don't see the time variable initialized (but it's not possible!).

Long time = System.currentTimeMillis();
this.tm = new RateTableModel(columnNames, oneriPratica, rate, rateizzazioniPreviste);
time = System.currentTimeMillis() - time;
System.out.println("DatiRatePanel2.populatePanel() 1 time: " + time);
rateTable = new MyTable(tm, columnModel, this);
time = System.currentTimeMillis() - time;
System.out.println("DatiRatePanel2.populatePanel() 2 time: " + time);
table = new ExcelAdapter(rateTable);
time = System.currentTimeMillis() - time;
System.out.println("DatiRatePanel2.populatePanel() 3 time: " + time);
scrollPane = new JScrollPane(rateTable);
time = System.currentTimeMillis() - time;
System.out.println("DatiRatePanel2.populatePanel() 4 time: " + time);
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
this.add(scrollPane, "1, 3, fill, fill");
aggiornaTotali();
this.invalidate();
this.validate();
this.repaint();
time = System.currentTimeMillis() - time;
System.out.println("DatiRatePanel2.populatePanel() 5 time: " + time);

Output:

DatiRatePanel2.populatePanel() 1 time: 2
DatiRatePanel2.populatePanel() 2 time: 1364288266968
DatiRatePanel2.populatePanel() 3 time: 2
DatiRatePanel2.populatePanel() 4 time: 1364288266969
DatiRatePanel2.populatePanel() 5 time: 3

EDIT4: activated level 5 in the java plugin console and this is what I got:

DettagliPratichePanel.updateObjects() impostazione oneri
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findWhereNomeConfigurazioneEqualsConfRateizzazioni con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findWhereNomeConfigurazioneEqualsConfRateizzazioni con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findWhereNomeConfigurazioneEqualsConfRateizzazioni con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findWhereNomeConfigurazioneEqualsConfRateizzazioni con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findByConfRateizzazioniConfRata con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findByConfRateizzazioniConfRata con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findByConfRateizzazioniConfRata con proxy=DIRECT
network: Connessione a http://192.168.146.145:8080/GestioneOneriServlet/findByConfRateizzazioniConfRata con proxy=DIRECT
DettagliPratichePanel.updateObjects() polizza
basic: JNLP2ClassLoader.findClass: geotel.utils.RateTableModel: try again ..
DatiRatePanel2.populatePanel() 1 time: 2
DatiRatePanel2.populatePanel() 3 time: 1364309403101
DatiRatePanel2.populatePanel() 4 time: 3
DatiRatePanel2.populatePanel() 5 time: 1364309403102
basic: JNLP2ClassLoader.findClass: geotel.utils.MyTable$ButtonsCellRenderer: try again ..
------------------------------------------------------------------------ Here starts trouble
network: Connessione a http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar con proxy=DIRECT
network: Connessione a http://192.168.146.129:8091/ con proxy=DIRECT
network: Connessione http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar con cookie "__ac="Qt/t/I4Nt7/qj0H5vhUrqR+ZrJYgcHJvZ2V0dGlzdGEx"; _ZopeId="97847822A52RRctuIzM""
network: CleanupThread used 1 us
network: Scaricamento risorsa: http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar
    Content-Length: 1.940.942
    Content-Encoding: null
network: URL http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar scritto su file C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-15459ea4-temp
security: File lista librerie sicure non trovato
cache: Create from verifier: JarSigningData{hasOnlySignedEntries=true, hasSingleCodeSource=true, hasMissingSignedEntries=false}
network: CleanupThread used 2 us
cache: Replacing MemoryCache entry (cnt=2) for http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jarwas=com.sun.deploy.cache.CacheEntry (29348568) now=com.sun.deploy.cache.CacheEntry (24374818)
network: Connessione a http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar con proxy=DIRECT
network: Connessione a http://192.168.146.129:8091/ con proxy=DIRECT
network: Connessione http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar con cookie "__ac="Qt/t/I4Nt7/qj0H5vhUrqR+ZrJYgcHJvZ2V0dGlzdGEx"; _ZopeId="97847822A52RRctuIzM""
network: CleanupThread used 1 us
network: Scaricamento risorsa: http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar
    Content-Length: 1.940.942
    Content-Encoding: null
network: URL http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar scritto su file C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-27c7ae17-temp
security: File lista librerie sicure non trovato
cache: Create from verifier: JarSigningData{hasOnlySignedEntries=true, hasSingleCodeSource=true, hasMissingSignedEntries=false}
network: CleanupThread used 1 us
cache: Replacing MemoryCache entry (cnt=3) for http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jarwas=com.sun.deploy.cache.CacheEntry (24374818) now=com.sun.deploy.cache.CacheEntry (8045053)

-------------------------------------This block is repeated at least 30 times before this
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\23\5d616017-2432b323
cache: MemoryCache: removed entry http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-515e0fde
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-515e0fde
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-642e11c6
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-642e11c6
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-36c18954
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-36c18954
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-3dd37d44
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-3dd37d44
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-74a8c32b
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-74a8c32b
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-2278e899
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-2278e899
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-36a95dca
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-36a95dca
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-15459ea4
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-15459ea4
cache: Create from verifier: JarSigningData{hasOnlySignedEntries=true, hasSingleCodeSource=true, hasMissingSignedEntries=false}
network: CleanupThread used 2 us
cache: Adding MemoryCache entry: http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar
network: Connessione a http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar con proxy=DIRECT
network: Connessione a http://192.168.146.129:8091/ con proxy=DIRECT
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\23\5d616017-1cffa7d0
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\14\39df63ce-72747a9e
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\15\7e499c8f-55d9e14b
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\23\5d616017-1ff05f86
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\14\39df63ce-3623cf5c
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\15\7e499c8f-767f4e5c
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-78a94a0b
network: Connessione http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar con cookie "__ac="Qt/t/I4Nt7/qj0H5vhUrqR+ZrJYgcHJvZ2V0dGlzdGEx"; _ZopeId="97847822A52RRctuIzM""
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-16cf3e35
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\14\39df63ce-3d8f935b
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\15\7e499c8f-2b757fb1
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\23\5d616017-65139493
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\14\39df63ce-1d5deb21
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\15\7e499c8f-3a4f46c6
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-48a86fb3
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-4b1ec669
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\23\5d616017-1c1ed2e1
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\14\39df63ce-35f43fda
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\15\7e499c8f-14bf2ddf
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-10a0c30f
network: CleanupThread used 1 us
network: Scaricamento risorsa: http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar
    Content-Length: 1.940.942
    Content-Encoding: null
network: URL http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar scritto su file C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-203bfb91-temp
security: File lista librerie sicure non trovato
cache: Create from verifier: JarSigningData{hasOnlySignedEntries=true, hasSingleCodeSource=true, hasMissingSignedEntries=false}
network: CleanupThread used 1 us
cache: Replacing MemoryCache entry (cnt=3) for http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jarwas=com.sun.deploy.cache.CacheEntry (20330403) now=com.sun.deploy.cache.CacheEntry (8313353)
cache: MemoryCache: removed entry http://192.168.146.129:8091/Scia/sportello-unico-edilizia/archivio-pratiche-edilizie/permesso_di_costruire.2012-10-25.0455740504/portal_url/++resource++java/GestioneOneri.jar
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-25fd39ec
cache: Closing CachedJarFile C:\Users\Andrea\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\51\58374d33-25fd39ec

What I can understand here is that after that classloader searches for the inner class ButtonsCellRenderer it starts this flooding (that eventually blocks everything in the webpage, including the java console). Can this problem be caused by the fact it is an inner class?

As Joop Eggen asked, I'm posting the code of my JTable. package geotel.utils;

import geotel.configuration.Configuration;
import geotel.gui.DatiPersonaliPanel;
import geotel.gui.DatiRatePanel2;
import geotel.gui.GestionePratichePanel;
import geotel.gui.IManager;
import geotel.gui.ImportazionePanel;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;

public class MyTable extends JTable
{
class ButtonsCellRenderer extends JPanel implements TableCellRenderer
{
    private static final long serialVersionUID = -4945689480058875463L;

    public Component getTableCellRendererComponent(final JTable table, Object value, boolean isSelected, boolean hasFocus, final int row, int column)
    {
        this.setLayout(new GridLayout(1, 1));
        if(gestione instanceof ImportazionePanel)
        {
            if(column == 0)
            {
                URL editUrl = getClass().getResource("/resource/images/051.gif");
                Image editImage = Toolkit.getDefaultToolkit().getImage(editUrl);
                JButton edit = new JButton(new ImageIcon(editImage));
                edit.setBorderPainted(false);
                edit.setContentAreaFilled(false);
                edit.setFocusPainted(false);
                edit.setOpaque(false);
                this.add(edit);
            }
            else
            {
                new Exception("else non gestito").printStackTrace();
            }
        }
        else
        {
            if(column == 0)
            {
                URL editUrl = getClass().getResource("/resource/images/005.gif");
                Image editImage = Toolkit.getDefaultToolkit().getImage(editUrl);
                JButton editB = new JButton(new ImageIcon(editImage));
                editB.setBorderPainted(false);
                editB.setContentAreaFilled(false);
                editB.setFocusPainted(false);
                editB.setOpaque(false);
                if(gestione instanceof GestionePratichePanel)
                {
                    if(Configuration.getRuoloUtenteConnesso().getModificaPratica())
                    {
                        if(edit)
                            editB.setEnabled(true);
                        else
                            editB.setEnabled(false);
                    }
                    else
                        editB.setEnabled(false);
                }
                else if(gestione instanceof DatiRatePanel2)
                {
                    if(getValueAt(row, 5) != null && !getValueAt(row, 5).equals(""))
                        editB.setEnabled(false);
                    else if(Configuration.getRuoloUtenteConnesso().getModificaPagamento())
                    {
                        if(edit)
                            editB.setEnabled(true);
                        else
                            editB.setEnabled(false);
                    }
                    else
                        editB.setEnabled(false);
                }
                else if(gestione instanceof DatiPersonaliPanel)
                {
                    if(edit)
                        editB.setEnabled(true);
                    else
                        editB.setEnabled(false);
                }
                this.add(editB);
            }
            else
            {
                URL removeUrl = getClass().getResource("/resource/images/003.gif");
                Image removeImage = Toolkit.getDefaultToolkit().getImage(removeUrl);
                JButton remove = new JButton(new ImageIcon(removeImage));
                remove.setBorderPainted(false);
                remove.setContentAreaFilled(false);
                remove.setFocusPainted(false);
                remove.setOpaque(false);
                if(gestione instanceof GestionePratichePanel)
                {
                    if(Configuration.getRuoloUtenteConnesso().getEliminaPratica())
                    {
                        if(edit)
                            remove.setEnabled(true);
                        else
                            remove.setEnabled(false);
                    }
                    else
                        remove.setEnabled(false);
                }
                else if(gestione instanceof DatiRatePanel2)
                {
                    if(getValueAt(row, 5) != null && !getValueAt(row, 5).equals(""))
                        remove.setEnabled(false);
                    else if(Configuration.getRuoloUtenteConnesso().getEliminaPagamento())
                    {
                        if(edit)
                            remove.setEnabled(true);
                        else
                            remove.setEnabled(false);
                    }
                    else
                        remove.setEnabled(false);
                }
                else if(gestione instanceof DatiPersonaliPanel)
                {
                    if(edit)
                        remove.setEnabled(true);
                    else
                        remove.setEnabled(false);
                }
                this.add(remove);
            }
        }
        return this;
    }
}

class MyTableButtonMouseListener implements MouseListener
{
    private JTable ptable;

    public MyTableButtonMouseListener(JTable table)
    {
        ptable = table;
    }

    private void forwardEventToButton(MouseEvent e)
    {
        TableColumnModel columnModel = ptable.getColumnModel();
        int column = columnModel.getColumnIndexAtX(e.getX());
        int row = e.getY() / ptable.getRowHeight();
        int value;

        if(gestione instanceof ImportazionePanel)
        {
            if(row < ptable.getRowCount() && row >= 0 && column >= 0 && column < 1)
            {
                ((ImportazionePanel) gestione).importSelected((String) ptable.getValueAt(row, 1));
                ptable.repaint();
            }
        }
        else
        {
            if(row < ptable.getRowCount() && row >= 0 && column >= 0 && column < 2)
            {
                try
                {
                    value = (Integer) ptable.getValueAt(row, 2);
                    switch(column)
                    {
                        case 0:
                        {
                            gestione.editAction(value);
                            break;
                        }
                        case 1:
                        {
                            gestione.deleteAction(value);
                            break;
                        }
                        default:
                            break;
                    }
                    ptable.repaint();
                }
                catch(Exception e1)
                {
                    e1.printStackTrace();
                }
            }
        }
    }

    public void mouseClicked(MouseEvent e)
    {
        forwardEventToButton(e);
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }

    public void mousePressed(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }
}

private static final long serialVersionUID = 3591458853529380099L;

protected IManager gestione;
protected TableModel tm;
protected boolean edit;

public MyTable()
{
    super();
    this.setBackground(new Color(244, 244, 244));
    this.setShowHorizontalLines(true);
    this.setShowVerticalLines(true);
    this.getTableHeader().setReorderingAllowed(false);
    this.setRowSelectionAllowed(true);
    this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    this.setFillsViewportHeight(true);
    this.addMouseListener(new MyTableButtonMouseListener(this));
}

public MyTable(TableModel tm, TableColumnModel columns, IManager gestione, boolean edit)
{
    super(tm, columns);
    this.tm = tm;
    this.gestione = gestione;
    this.edit = edit;
    // this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    this.setBackground(new Color(244, 244, 244));
    this.setShowHorizontalLines(true);
    this.setShowVerticalLines(true);
    this.getTableHeader().setReorderingAllowed(false);
    this.setRowSelectionAllowed(true);
    this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    this.setFillsViewportHeight(true);
    this.addMouseListener(new MyTableButtonMouseListener(this));
}

public TableCellRenderer getCellRenderer(int row, int column)
{
    if(this.gestione instanceof ImportazionePanel)
    {
        if(column < 1)
        {
            return new ButtonsCellRenderer();
        }
        else
            return super.getCellRenderer(row, column);
    }
    else
    {
        if(column < 2)
        {
            return new ButtonsCellRenderer();
        }
        else
        {
            return super.getCellRenderer(row, column);
        }
    }
}

public RataTableRow getRowObjectByIndex(int row)
{
    if(gestione instanceof DatiRatePanel2)
    {
        return ((RateTableModel) tm).getRowObjectByIndex(row);
    }
    return null;
}

public Object[] getRowObjectById(Integer id)
{
    Object[] ret = null;
    for(int i = 0; i < tm.getRowCount(); i++)
    {
        if(tm.getValueAt(i, 2).equals(id))
        {
            ret = new Object[tm.getColumnCount()];
            for(int j = 0; j < tm.getColumnCount(); j++)
                ret[j] = tm.getValueAt(i, j);
            break;
        }
    }
    return ret;
}

public Component prepareRenderer(TableCellRenderer renderer, int Index_row, int Index_col)
{
    Component comp = super.prepareRenderer(renderer, Index_row, Index_col);
    // even index, selected or not selected
    if(Index_row % 2 == 0)
    {
        if(!isCellSelected(Index_row, Index_col))
            comp.setBackground(new Color(240, 240, 240));
        else
        {
            comp.setForeground(Color.black);
            comp.setBackground(Color.green);
        }
    }
    else
    {
        if(!isCellSelected(Index_row, Index_col))
            comp.setBackground(Color.white);
        else
        {
            comp.setForeground(Color.black);
            comp.setBackground(Color.green);
        }
    }
    return comp;
}
}
like image 903
Andrea Avatar asked Mar 21 '13 15:03

Andrea


2 Answers

Wandering on the net I found this thread: jar downloaded multiple times Since among my applet problems there was one similar to this I followed the instructions in one of the replies (specifically turning off Control panel/java/general tab/temporary internet files/Keep temporary Internet files on my computer) and guess what... the problem of the multiple downloads is gone, and at least in the browser the exception that caused the UI to freeze seems to be gone too. I'm going to try in the eclipse debugger what's happening now. Anyone can explain what the users mean in the last two posts? About tomcat setting a cache filter. How can I check that? What should I look for with Wireshark? Thank you

like image 43
Andrea Avatar answered Sep 28 '22 00:09

Andrea


With some experience my guess is, that the class-not-found issue derives from a side-issue, debug environment, class loading info, first loading or so.

With a table model a heavy penalty may arise, like in a TreeModel where erroneously a TreeNode instantiates all its child TreeNodes recursively.

I would first look for similar behaviour, maybe profiling your table model class. Certainly I would switch some tabs if possible, to see if there was cleanup code in the prior tab.

For what I could see, you are using JDBC in the applet. This is costly, so definitely log all SQL calls.

Not a concrete answer, but I am curious whether I was partially right (like any charlatan clear-voyant).


After extended question code

The problem is in having too much work in the renderer. Do the following. It could be written even more compact.

What still is suspect, is that the old JButton.isEnabled() is maintained in the original and this code.

private JButton editB = new JButton();
private final Icon ICON_051;
private final Icon ICON_005;
private final Icon ICON_003;

public ButtonsCellRenderer()
{
    {
        URL editUrl = getClass().getResource("/resource/images/051.gif");
        Image editImage = Toolkit.getDefaultToolkit().getImage(editUrl);
        ICON_051 = new ImageIcon(editImage);
    }
    {
        URL editUrl = getClass().getResource("/resource/images/005.gif");
        Image editImage = Toolkit.getDefaultToolkit().getImage(editUrl);
        ICON_005 = new ImageIcon(editImage);
    }
    {
        URL editUrl = getClass().getResource("/resource/images/003.gif");
        Image editImage = Toolkit.getDefaultToolkit().getImage(editUrl);
        ICON_003 = new ImageIcon(editImage);
    }
    this.setLayout(new GridLayout(1, 1));
    editB.setBorderPainted(false);
    editB.setContentAreaFilled(false);
    editB.setFocusPainted(false);
    editB.setOpaque(false);
    this.add(editB);
}

public Component getTableCellRendererComponent(final JTable table, Object value, boolean isSelected, boolean hasFocus, final int row, int column)
{
    if(gestione instanceof ImportazionePanel)
    {
        if(column == 0)
        {
            editB.setIcon(ICON_051);
        }
        else
        {
            new Exception("else non gestito").printStackTrace();
        }
    }
    else
    {
        boolean enabled = editB.isEnabled();
        if(column == 0)
        {
            editB.setIcon(ICON_005);
            if(gestione instanceof GestionePratichePanel)
            {
                enabled = Configuration.getRuoloUtenteConnesso().getModificaPratica() && edit;
            }
            else if(gestione instanceof DatiRatePanel2)
            {
                if(getValueAt(row, 5) != null && !getValueAt(row, 5).equals(""))
                    enabled = false;
                else
                    enabled = Configuration.getRuoloUtenteConnesso().getModificaPagamento() && edit;
               else
                    enabled = false;
            }
            else if(gestione instanceof DatiPersonaliPanel)
            {
                enabled = edit;
            }
        }
        else
        {
            editB.setIcon(ICON_003);
            if(gestione instanceof GestionePratichePanel)
            {
                enabled = Configuration.getRuoloUtenteConnesso().getEliminaPratica() && edit;
            }
            else if(gestione instanceof DatiRatePanel2)
            {
                if(getValueAt(row, 5) != null && !getValueAt(row, 5).equals(""))
                    enabled = false;
                else
                    enabled = Configuration.getRuoloUtenteConnesso().getEliminaPagamento() && edit;
            }
            else if(gestione instanceof DatiPersonaliPanel)
            {
                eenabled = true;
            }
        }
        editB.setEnabled(enabled);
    }
    return this;
}
like image 187
Joop Eggen Avatar answered Sep 28 '22 01:09

Joop Eggen