Le rendu Swing apparaît cassé en JDK 1.8, correct en 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é quelques GUI avec le concepteur de formulaires GUI.

puis j'ai regardé le code et j'ai réalisé que quelque chose n'allait 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. En outre, le bouton perd son texte, quand je déplace ma souris sur elle.

Donc Je installé JDK 1.7.0_40 (x64), recompilé le projet et exécuté à nouveau.

la forme suivante apparaît, quand j'utilise JDK 1.7: Rendering OK JDB 1.7.0_40

le rendu semble être OK et le bouton est aussi OK.

donc j'ai installé les plus récents graphiques et pilotes de Chipset et beaucoup plus, mais le problème existe toujours. 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é.


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 à partir de 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 JFrame simple avec les composants en elle.

SimpleClient - Screenshot immediately after Start

quand j'écris un texte, ou que je pose ma souris sur le bouton, les composants sont rendus comme ceci (Text: testsentence.123; Étiquette-Bouton: TestButton)

after writing - or mouse over

53
demandé sur duffy356 2014-03-30 02:08:27

8 réponses

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

définit la variable d'environnement global "J2D_D3D" à "false" dans L'OS. Selon Sun, ce réglage est utilisé pour désactiver L'utilisation de Direct3D par le système Java 2D à partir de la version 1.4.1_02 de Java.

ie: il suffit de créer 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, espérons-le ne aussi la vôtre.

48
répondu 25mhz 2014-10-28 14:00:47

finalement j'ai trouvé la solution à mon problème. J'ai dû changer les réglages de contrôle d'énergie de mon NVIDIA GeForce 620M pour une performance maximale.

13
répondu duffy356 2014-04-01 16:11:01

vous pouvez suivre ces étapes:

  1. clic droit sur le bureau et cliquez sur Nvidia Panneau de contrôle
  2. sélectionnez "Gérer les paramètres 3D" dans le volet de gauche
  3. sélectionnez l'onglet "Paramètres du programme" dans la fenêtre principale
  4. Cliquez Sur "Ajouter"
  5. naviguez vers votre dossier java (C:\Program fichiers\Java\jre1.8.0_20\bin) et sélectionnez javaw.exe et appuyez sur 'ouvrir'(cette étape dépendra probablement votre système d'exploitation, mais devrait être assez facile à trouver)
  6. où il est dit "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 pouvez y aller.
9
répondu Lord ST 2015-01-04 17:34:11

j'ai exactement le même problème. Ce que j'ai trouvé après le réglage de la qualité de duffys:

mon ordinateur portable fonctionne à la fois un Intel HD 4000 et un NVS 5200M. Exécuter des applications Swing avec Java 7 est parfait sur les deux cartes. Avec Java 8 Swing GUIs rendus par la carte Intel (indépendamment des paramètres de qualité) look émietté (comme dans Duffys Screenshot), en utilisant le NVS 5200M qu'ils regardent comme ils le faisaient.

N'a rien trouvé sur le java bug tracker, sur le d'autre part, il est difficile de décrire ce bogue.

8
répondu nbred 2014-04-02 15:16:52
textArea1.setSize(500, 300);

il y a un problème. Java GUIs pourrait devoir travailler sur un certain nombre de plates-formes, sur des résolutions d'écran différentes et en utilisant des plans différents. En tant que telles, elles ne sont pas propices à un placement exact ou à un calibrage des composants. Pour organiser les composants pour une interface graphique robuste, utilisez plutôt des managers de mise en page, ou des combinaisons d'entre eux 1 , avec la mise en page padding & borders pour espace blanc 2 .

2
répondu Andrew Thompson 2017-05-23 12:32:02

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
répondu Rafael Gimenes 2016-11-17 09:51:43

fixation similaire à duffy356:

Lenovo T430s tournant sous Windows 7 64 bit avec NVIDIA NVS 5200M aux côtés de HD 4000. Mise à jour de Java 8 la mise à jour 5 a créé des graphiques et des boutons de corruption pour deux applications Swing, jEdit et Freemind.

utilisant l'applet du panneau de contrôle NVIDIA pour modifier les paramètres globaux du Mode de gestion de L'énergie pour "préférer la performance maximale" semble avoir réglé ce problème.

Je ne suis pas sûr qu'il y ait un problème avec la façon dont les applications fixent les tailles.

1
répondu Halfabee2 2014-07-07 12:18:19

suit:

  1. panneau de contrôle
  2. système et sécurité
  3. système
  4. paramètres d'utilisation à Distance
  5. onglet Avancé
  6. , cliquez sur variables d'Environnement
  7. créer une variable J2D_D3D
  8. et mettez la valeur à false.

a travaillé pour moi,....

0
répondu Vishal Patil 2018-01-10 00:18:51