5

奇妙な動作をするアプレットを開発しています。これは通常の「ブラウザでアプレットを起動できない」問題ではなく、もっと微妙な問題です。

アプレットは 8 つのタブを持つ jtabbedpane で構成され、それぞれがワークフローでデータ操作を行います。ユーザーには、タブを切り替えるための 2 つのボタン (戻ると進む) があります。

ブラウザで実行すると(最新のクロムまたはFirefoxですが、これは問題ではありません)、7番目から8番目のタブに渡すときに一貫して速度が低下していることに気付きます。後者では、そのタブにカスタムテーブルモデルを持つjtableを配置し、日食では問題なく動作します。いくつかのデバッグ手順の後、jvm がクラス RateTableModel (私のカスタム テーブルモデル) に対して classnotfoundexception をスローすることに気付きました。奇妙なことに、IDE とブラウザーへの自己署名アプレットの両方でアプレットをテストしても、コンソールで例外がスローされることはありません。私はどこでも確認しました: 空の catch ブロックはありません。すべての例外は常にそのスタックトレースを出力し、テーブルモデルの初期化コードを try/catch ブロックに入れると、その例外は決してキャッチされません。

私が聞きたいのは、なぜこれが起こるのかについての考えです。

クラス RateTableModel はパッケージ geotel.utils にあります。ここには、このクラスをロードする前に定期的にインスタンス化する他のクラスがあり、このクラスが jar に存在することを確認しました。

開発の詳細 (これを読んでいる人にとっては役立つかもしれません):

アプレットは、コマンドを使用して署名されます

jarsigner -keystore keystore3 C:\GestioneOneri.jar me3

アプレットは次の html ファイルから実行されます。

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

JNLP ファイルは次のとおりです。

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

ClassNotFoundException の原因となるコードは次のとおりです。

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

クラスRateTableModelの定義は

public class RateTableModel extends AbstractTableModel

編集:さらにいくつかのデバッグ手順を実行した後、デバッグ ビューにスクリーンショットの状況があることがわかりました デバッグ

これらのキーが何を表しているのかまったくわかりませんが、F5 (ステップイン) を押し続けると、これらのキーが消え、次のステップで実行が続行され、クラスローダーは魔法のようにクラス RateTableModel を見つけることができるようになります。どうすればこれを取り除くことができますか?

ありがとうございました!

EDIT2: Eclipse ドキュメントのキー アイコンについて少し調べたところ、ロックされたオブジェクトのモニターであることがわかりました。私が知る限り、同期されたコード ブロックがある場所にモニターが表示されますが、ここにはありません (これらのブロックは呼び出されていないと確信しています)。それは私を怒らせています...

EDIT3:各命令に必要な時間についていくつかのprintlnsを入れてみました。以下はソースコードと出力です。print 2 と 4 で時間が「リセット」されている (またはそのように見える) 理由がわかりません。時間変数が初期化されていないスレッドがもっとあるようです (しかし、それは不可能です!)。

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

出力:

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: Java プラグイン コンソールでレベル 5 を有効にすると、次のようになりました。

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

ここで私が理解できるのは、そのクラスローダーが内部クラス ButtonsCellRenderer を検索した後、このフラッディングを開始することです (最終的に Java コンソールを含む Web ページ内のすべてをブロックします)。この問題は、それが内部クラスであるという事実によって引き起こされる可能性がありますか?

Joop Eggen が尋ねたように、JTable のコードを投稿します。パッケージ 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;
}
}
4

2 に答える 2

4

私の推測では、class-not-found の問題は、副次的な問題、デバッグ環境、クラスのロード情報、最初のロードなどに由来すると思います。

テーブル モデルでは、TreeNode が誤ってそのすべての子 TreeNode を再帰的にインスタンス化する TreeModel のように、大きなペナルティが発生する可能性があります。

私は最初に同様の動作を探し、おそらくテーブルモデルクラスをプロファイリングします。確かに、可能であればいくつかのタブを切り替えて、前のタブにクリーンアップ コードがあったかどうかを確認します。

私が見る限り、あなたはアプレットで JDBC を使用しています。これにはコストがかかるため、必ずすべての SQL 呼び出しをログに記録してください。

具体的な答えではありませんが、私が部分的に正しかったかどうかに興味があります (ペテン師の明確な視点のように)。


拡張質問コードの後

問題は、レンダラーでの作業が多すぎることです。以下をせよ。もっとコンパクトに書けます。

まだ疑わしいのは、古いものJButton.isEnabled()が元のコードとこのコードで維持されていることです。

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;
}
于 2013-03-26T09:42:45.747 に答える