Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Restriction sur une librairie requise


Sujet :

API standards et tierces Java

  1. #1
    Membre averti
    Restriction sur une librairie requise
    Bonjour
    Je viens de découvrir un problème que je n'avais pas avec java 7 mais que j'ai avec java 8.
    sous eclipse le code suivant
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            tableau.getTableHeader().setDefaultRenderer(new DefaultTableCellHeaderRenderer()
            {
                @Override
                public Component getTableCellRendererComponent(JTable table, Object value,  boolean isSelected, boolean hasFocus, int lig, int col) 
                {
                    Component c = super.getTableCellRendererComponent(table, value, isSelected,  hasFocus, lig, col);
                    if( ((Tableau)table).isEditable(col)) c.setForeground(Color.RED);
                    else c.setForeground(Color.BLACK);
                    return c;
                }
            });

    est en erreur

    DefaultTableCellHeaderRenderer me renvoie l'erreur suivante :
    Access restriction: The type 'DefaultTableCellHeaderRenderer' is not API (restriction on required library 'C:\Program Files\Java\jre1.8.0_45\lib\rt.jar')

    et la ligne
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, lig, col); renvoie
    Access restriction: The method 'DefaultTableCellHeaderRenderer.getTableCellRendererComponent(JTable, Object, boolean, boolean, int, int)' is not API (restriction on required library 'C:\Program Files\Java\jre1.8.0_45\lib\rt.jar')
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Rédacteur/Modérateur

    Est-ce que tu es sous Eclipse ?

    Si oui, compares ton problème à celui-ci : http://www.developpez.net/forums/d12...e/#post7012513 (et esssayes d'appliquer la correction).
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre averti
    Citation Envoyé par Logan Mauzaize Voir le message
    Est-ce que tu es sous Eclipse ?

    Si oui, compares ton problème à celui-ci : http://www.developpez.net/forums/d12...e/#post7012513 (et esssayes d'appliquer la correction).
    En effet c'était bien un problème d'autorisation. J'en ai marre que mon ordi que je suis seul à utiliser et qui ne contient aucun secret d'état se transforme en fort-knocx

    Merci beaucoup

    Résolu
    C'est en respectant les autres que l'on se fait respecter.

  4. #4
    Membre averti
    Citation Envoyé par Patrice Henrio Voir le message
    En effet c'était bien un problème d'autorisation. J'en ai marre que mon ordi que je suis seul à utiliser et qui ne contient aucun secret d'état se transforme en fort-knocx

    Merci beaucoup

    Résolu
    Et bien non. Le problème est revenu. Quelqu'un a-t'il déjà rencontré cela ?

    Je rappelle l'erreur :
    Access restriction: The type 'DefaultTableCellHeaderRenderer' is not API (restriction on required library 'C:\Program Files\Java\jre1.8.0_45\lib\rt.jar')

    Or rt.jar est tout ce qu'il y a de plus classique.

    Je programme sous deux versions d'eclipse avec la même JRE (1.8). Pour la même classe
    sous la version
    Version: Kepler Service Release 1, Build id: 20130919-0819
    pas d'alerte

    sous la version
    Version: Luna Service Release 2 (4.4.2), Build id: 20150219-0600
    erreur indiquée ci-dessus.
    C'est en respectant les autres que l'on se fait respecter.

  5. #5
    Rédacteur/Modérateur

    En fait c'est un comportement normal, puisque DefaultTableCellHeaderRenderer fait partie du package "sun.swing.table". Les packages préfixés par "sun." sont censés être privés car ils ne font pas partie de l'API Java mais de son implémentation par Sun/Oracle.
    Si tu utilises une autre implémentation de la JVM ou suivant les évolutions avenirs, le fonctionnement de ton code n'est pas garantie.

    Sinon tu peux modifier les restrictions d'accès dans les propriétés de ton projet :



    Sélectionnez :
    • Résolution : Accessible
    • Rule Pattern : sun/swing/table/**



    Toutes ces informations seront enregistrées dans le fichier ".classpath" de ton projet que tu pourras éventuellement remettre en configuration.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  6. #6
    Membre averti
    Merci beaucoup. Le problème est effectivement réglé . J'avais bien vu qu'il y avait quelque chose de ce genre là (api non publique) mais pourquoi la version précédente d'eclipse laissait passer cela sans problème et que là elle bloque ?
    C'est en respectant les autres que l'on se fait respecter.

  7. #7
    Rédacteur/Modérateur

    Est-ce que le fichier .classpath est un élément partagé ?

    Comme tu peux le voir sur mes captures j'ai spécifié un environnement d'exécution (pas de VM particulière), peut-être que le comportement est différent si tu dis dépendre d'une VM en particulier.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  8. #8
    Membre averti
    Citation Envoyé par Logan Mauzaize Voir le message
    Est-ce que le fichier .classpath est un élément partagé ?

    Comme tu peux le voir sur mes captures j'ai spécifié un environnement d'exécution (pas de VM particulière), peut-être que le comportement est différent si tu dis dépendre d'une VM en particulier.
    J'ai exactement la même chose que toi quand je clique sur Project/Properties/Java Build Path/Libraries/JRE System Library [JavaSE-1.8].
    De là à savoir sir le .classpath est partagé ... je ne me suis jamais posé la question.
    C'est en respectant les autres que l'on se fait respecter.