web-dev-qa-db-fra.com

Le rendu de swing semble rompu dans JDK 1.8, correct dans JDK 1.7

J'ai installé IntelliJ IDEA (13.1.1 # IC-135.480) et JDK 1.8.0 (x64) et j'ai généré une interface graphique avec le concepteur de formulaires GUI.

Ensuite, j'ai exécuté le code et réalisé que quelque chose ne va pas.

Voici une capture d'écran de mon interface graphique: Buggy Rendering JDK 1.8.0

Le rendu de la police ne semble pas correct. De plus, le bouton perd son texte lorsque je déplace ma souris dessus.

J'ai donc installé JDK 1.7.0_40 (x64), recompilé le projet et relancé.

Le formulaire suivant apparaît lorsque j'utilise JDK 1.7: Rendering OK JDB 1.7.0_40

Le rendu semble être OK et le bouton est également OK.

J'ai donc installé les derniers pilotes graphiques et chipsets et bien plus encore, mais le problème persiste. Avez-vous déjà eu de tels problèmes avec Java Swing UIs? Pourriez-vous m'aider à résoudre mes problèmes? Toute aide serait grandement appréciée.


MISE À JOUR:

J'ai créé un petit projet avec seulement 1 JTextArea et 1 JButton et j'ai les mêmes problèmes de rendu.

Selon Andrew Thompson, j'ai changé le setSize () et je commence par EDT. L'exemple ci-dessous:

package at.maeh.Java.client.simpleTextClient;

import javax.swing.*;
import Java.awt.*;

public class SimpleClient extends JFrame {
    private JPanel panel1;
    private JTextArea textArea1 = new JTextArea();
    private JButton button1 = new JButton();

    public SimpleClient() {
        super("SimpleClient");

        // Panel
        panel1 = new JPanel();
        panel1.setLayout(new FlowLayout());

        // BUtton
        button1.setText("TestButton");

        // TextArea
        textArea1.setColumns(40);
        textArea1.setRows(15);

        // Add Components
        panel1.add(textArea1);
        panel1.add(button1);

        // Add to Frame
        this.getContentPane().add(panel1);

        // pack and set Visible
        pack();
        setVisible(true);

        System.out.println("Constructor EDT: " + SwingUtilities.isEventDispatchThread());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(SimpleClient::new);

        System.out.println("Main EDT: " + SwingUtilities.isEventDispatchThread());
    }
}

Le résultat est un simple JFrame avec les composants qu'il contient.

SimpleClient -> Screenshot immediately after Start

Lorsque j'écris du texte ou que je déplace mon pointeur de souris sur le bouton, les composants sont rendus comme ceci (texte: testsentence.123; étiquette de bouton: testbutton)

after writing - or mouse over

56
duffy356

Enfin, j'ai trouvé la solution à mon problème. J'ai dû modifier les paramètres de contrôle de l'énergie de ma NVIDIA GeForce 620M pour des performances maximales.

13
duffy356

Pour ceux dont le problème n'a pas été résolu; essayez cette solution:

Définissez la variable d'environnement global "J2D_D3D" sur "false" dans le système d'exploitation. Selon Sun, ce paramètre est utilisé pour désactiver l'utilisation Java du système 2D de Direct3D dans Java 1.4.1_02 et versions ultérieures).

ie: créez simplement une variable d'environnement avec le nom "J2D_D3D" et la valeur "false" sans les guillemets.

cela a résolu mes problèmes de rendu, j'espère que le vôtre aussi.

49
25mhz

Vous pouvez suivre ces étapes:

  1. Cliquez avec le bouton droit sur le bureau et cliquez sur Panneau de configuration NVIDIA
  2. Sélectionnez "Gérer les paramètres 3D" dans le volet gauche
  3. Sélectionnez l'onglet "Paramètres du programme" dans la fenêtre principale
  4. Cliquez sur 'Ajouter'
  5. Accédez à votre Java (C:\Program Files\Java\jre1.8.0_20\bin) et sélectionnez javaw.exe et appuyez sur 'open' (cette étape dépendra probablement de votre système d'exploitation mais devrait être assez facile à trouver)
  6. Où il est indiqué "Sélectionnez le processeur graphique préféré pour ce programme", cliquez sur le menu déroulant et choisissez "Processeur NVIDIA haute performance"
  7. Cliquez sur "Appliquer" en bas à droite et vous êtes prêt à partir.
9
Lord ST

J ai exactement le même problème. Ce que j'ai trouvé après l'ajustement du paramètre de qualité de duffys:

Mon ordinateur portable fonctionne à la fois avec un Intel HD 4000 et un NVS 5200M. Exécuter des applications Swing avec Java 7 est très bien sur les deux cartes. Avec Java 8 interfaces graphiques Swing rendues par la carte Intel (quels que soient les paramètres de qualité)) dans duffys Screenshot), en utilisant le NVS 5200M, ils ressemblent à ce qu'ils étaient.

Impossible de trouver quoi que ce soit sur le Java, en revanche il est difficile de décrire ce bogue.

8
nbred

Dell Vostro 5480 avec ubuntu mate 16.04 J'ai eu un problème similaire. Il est corrigé en changeant le pilote Nvidia, en utilisant un pilote supplémentaire.

enter image description here

Et sélectionnez le profil NVidia. enter image description here

2
Rafael Gimenes
textArea1.setSize(500, 300);

Il ya un problème. Java peuvent devoir fonctionner sur un certain nombre de plates-formes, sur différentes résolutions d'écran et en utilisant différentes PLAF. En tant que telles, elles ne sont pas propices au placement exact ou au dimensionnement des composants. Pour organiser les composants pour une interface graphique robuste, utilisez à la place des gestionnaires de disposition, ou leurs combinaisons1, ainsi que le rembourrage de mise en page et les bordures pour espace blanc2.

2
Andrew Thompson

Correction similaire à duffy356:

Lenovo T430 exécutant Windows 7 64 bits avec NVIDIA NVS 5200M avec HD 4000. Mise à jour vers Java 8 mise à jour 5 a créé des graphiques et une corruption des boutons pour deux applications Swing, jEdit et Freemind.

L'utilisation de l'applet du panneau de configuration NVIDIA pour modifier les paramètres globaux du mode de gestion de l'alimentation sur "Préférer les performances maximales" semble avoir résolu ce problème.

Je ne sais pas s'il y a un problème caché avec la façon dont les applications définissent les tailles.

1
Halfabee2

pas:

  1. panneau de contrôle
  2. système et sécurité
  3. système
  4. Paramètres à distance
  5. Onglet Avancé
  6. cliquez sur Variables d'environnement
  7. créer une variable J2D_D3D
  8. et définissez la valeur sur false.

travaillé pour moi, ....

0
Vishal Patil