2013-03-21 15 views
5

Ich entwickle ein Applet, das sich seltsam verhält: Dies ist nicht das übliche "Ich kann mein Applet im Browser nicht starten" Problem, aber etwas subtiler.Applet versteckte classnotfound Ausnahme

Das Applet besteht aus einem Jabbedpane mit 8 Tabs, von denen jedes einige Datenmanipulation im Workflow durchführt, und der Benutzer hat zwei Schaltflächen (zurück und vorwärts), um durch Registerkarten zu wechseln.

Wenn ich es in den Browser (neueste Chrom oder Firefox, aber das spielt keine Rolle) Ich merke eine konsistente Verlangsamung beim Übergang von der 7. bis zur 8. Registerkarte: in der letzteren habe ich eine JTable mit einem benutzerdefinierten Tischmodell in dieser Registerkarte und in der Sonnenfinsternis läuft es gut. Ein paar Debug-Schritte später merke ich, dass der JVM eine ClassnotFounddexception für die Klasse RateTableModel, das ist mein benutzerdefiniertes TableModel, löst. Die seltsame Sache ist, dass, obwohl ich das Applet sowohl in der IDE als auch als selbstsigniertes Applet im Browser teste, diese Ausnahme niemals in irgendeiner Konsole geworfen wird. Ich habe es überall verifiziert: es gibt keine leeren catch-Blöcke, jede Ausnahme bekommt immer ihre Stackstrace-Datei und wenn ich den Initialisierungscode meines tableModel in einen try/catch-Block lege, wird diese Exception nie abgefangen. Noch lustiger ist, dass nach einer zufälligen Zeit die Ausführung so fortfährt, als ob nichts passiert wäre (nur diesmal in der IDE), während die GUI im Browser wie eine normale Ausnahme funktioniert: Sie vermasselt alles.

Was ich möchte fragen, ist für jede Idee, warum dies passiert.

Die Klasse RateTableModel befindet sich im Paket geotel.utils, wo ich andere Klassen habe, die ich regelmäßig instanziiere, bevor ich diese laden muss, und ich habe überprüft, dass diese Klasse im Jar vorhanden ist.

Einzelheiten über die Entwicklung (vielleicht für diejenigen, die diese Zeilen lesen kann nützlich sein):

Das Applet signiert ist mit dem Befehl

jarsigner -keystore keystore3 C:\GestioneOneri.jar me3 

das Applet aus der folgenden html-Datei ausgeführt wird:

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

die JNLP-Datei ist die folgende:

<?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> 

Der Code, der die ClassNotFoundException verursacht, ist die folgende: Klasse DatiRatePanel

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

und die Definition der Klasse RateTableModel

public class RateTableModel extends AbstractTableModel 

EDIT ist: nach ein paar weiteren Debug-Schritte, fand ich, dass in der Debug-Ansicht gibt es die Situation im Screenshot Debug

Ich habe absolut keine Die Idee, für was diese Schlüssel stehen, aber wenn ich F5 (Schritt in) gedrückt halte, gehen diese Schlüssel weg, im nächsten Schritt wird die Ausführung fortgesetzt und der Klassenlader wird in der Lage sein, die Klasse RateTableModel zu finden. Wie kann ich das loswerden?

Vielen Dank!

EDIT2: Ich habe ein wenig über die Schlüsselsymbole in der Eclipse-Dokumentation recherchiert und herausgefunden, dass es sich um Monitore auf gesperrten Objekten handelt. Soweit ich weiß, erscheinen Monitore dort, wo es synchronisierte Code-Blöcke gibt, die ich hier nicht habe (und ich bin mir sicher, dass diese Blöcke nicht aufgerufen werden). Es macht mich wütend ...

EDIT3: Ich habe versucht, einige Printlns über wie viel Zeit jeder Befehl benötigt, gefolgt von dem Quellcode und der Ausgabe. Ich verstehe nicht, warum die Zeiten in Print 2 und 4 "zurückgesetzt" werden (so scheint es), es scheint, als gäbe es mehr Threads, die die Zeitvariable nicht initialisiert sehen (aber das ist nicht möglich!).

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

Ausgang:

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: aktiviert Level 5 in der Java-Plug-Konsole und das ist, was ich habe:

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 

Was kann ich hier verstehen ist, dass nach dem Classloader sucht nach der inneren Klasse ButtonsCellRenderer startet diese Überflutung (die letztendlich alles auf der Webseite blockiert, einschließlich der Java-Konsole). Kann dieses Problem dadurch verursacht werden, dass es eine innere Klasse ist?

Wie Joop Eggen fragte, poste ich den Code meiner JTable. Paket 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; 
} 
} 
+0

Vielleicht gibt es eine Abhängigkeit in der geotel.utils.RateTableModel Klasse, die nicht zum Jar hinzugefügt wird, überprüfen Sie die Klassen von dieser Klasse, versuchen Sie, eins nach dem anderen zu entfernen und das Glas erneut zu testen, ob funktioniert . – fmodos

+0

Vielen Dank für Ihre Antwort (ich habe es vorher nicht gesehen). Ich werde prüfen, ob jede importierte Klasse im Jar ist. Wie auch immer, ich möchte dich etwas fragen: Wenn das Glas jetzt nicht funktioniert, wie kann es dann funktionieren, wenn ich importierte Klassen eins nach dem anderen entferne? Ich meine, da gibt es schon diese Klasse-nicht-Funde-Annahme, würde ich nicht eine weitere Klasse hinzufügen, die nicht so eine Ausnahme macht? – Andrea

+0

importieren geotel.dao.factory.RataDaoFactory; importieren geotel.domain.OnerePratica; importieren geotel.domain.Rata; import geotel.domain.RateizzazionePrevista; Import java.math.BigDecimal; importieren java.util.ArrayList; import java.util.Collections; importieren Sie java.util.Date; import javax.swing.table.AbstractTableModel; Dies ist die vollständige Importliste: Meine Klassen (Paket geotel. *) Sind alle im Glas. Die anderen Klassen sind Standard-Java-Klassen, die in der JVM vorhanden sein sollten ... – Andrea

Antwort

1

im Netz Wandering fand ich diesen Thread: jar downloaded multiple times Da unter meinem Applet Probleme gab es eine ähnlich diesem ich die Anweisungen in einer der Antworten gefolgt (speziell ausschalten Bedienfeld/java/Registerkarte Allgemein/Temporäre Internetdateien/Keep temporäre Internetdateien auf meinem Computer) und rate mal was ... das Problem der mehreren Downloads ist weg, und zumindest im Browser scheint die Ausnahme, die das Einfrieren der Benutzeroberfläche verursacht hat, auch weg zu sein. Ich werde im Eclipse-Debugger versuchen, was gerade passiert. Jeder kann erklären, was die Benutzer in den letzten zwei Posts meinen? Über Tomcat Einstellen eines Cache-Filters. Wie kann ich das überprüfen?Was sollte ich mit Wireshark suchen? Danke

4

Mit etwas Erfahrung meiner Vermutung ist, dass die Klasse nicht gefunden-Ausgabe von einer Seite-Ausgabe, Debug-Umgebung, Klasse Laden Info, ersten Laden oder so leitet.

Bei einem Tabellenmodell kann es zu einem schwerwiegenden Nachteil kommen, wie in einem TreeModel, wo ein TreeNode fälschlicherweise alle untergeordneten TreeNodes rekursiv instanziiert.

Ich würde zuerst für ein ähnliches Verhalten suchen, vielleicht Profiling Ihre Tabelle Modellklasse. Natürlich würde ich, wenn möglich, einige Tabs wechseln, um zu sehen, ob es im vorherigen Tab Cleanup-Code gab.

Für was ich sehen konnte, verwenden Sie JDBC im Applet. Das ist teuer, loggen Sie also unbedingt alle SQL-Aufrufe ein.

Keine konkrete Antwort, aber ich bin neugierig, ob ich teilweise richtig war (wie jeder charlatan klar-voyant).


Nach längerer Frage Code

Das Problem ist zu viel Arbeit in den Renderer zu haben. Folgendes tun. Es könnte noch kompakter geschrieben werden.

Was immer noch verdächtig ist, ist, dass das alte JButton.isEnabled() im Original und diesem Code beibehalten wird.

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; 
} 
+0

Was meinen Sie mit "Profiling Ihrer Tischmodellklasse"? – Andrea

+0

Das könnte eine wiederholte langsame Operation sein. Beispielsweise wiederholtes Holen einer Zeile für jede Spalte, in der das Zeilenabrufen langsam ist. –

+0

Ich weiß nicht, ob Sie es bemerkt haben, aber ich habe einen "EDIT4" -Abschnitt hinzugefügt, wo ich ein detailliertes JVM-Protokoll ablege. Ratet mal, was ... es gibt eine Operation, die etwa 30 mal wiederholt wurde. Weißt du was es ist und wie du es loswerden kannst? – Andrea

Verwandte Themen