2014-09-16 1 views
1

J'ai donc rencontré un problème particulier.Swing JLabel caractères manquants

Mon interface est juste une étiquette unique, et un JSlider.

Mon code (dépouillé):

import javax.swing.*; 
import java.awt.*; 

public class Broken { 
    JLabel value = new JLabel(); 
    JSlider slider = new JSlider(0, 255, 0); 
    public Broken() { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel panel = new JPanel(); 
       value.setText("Some Value"); 
       panel.add(value); 
       JFrame frame = new JFrame("Frame Name"); 
       frame.setLayout(new GridLayout(2, 1)); 
       frame.add(panel); 
       frame.add(slider); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     new Broken(); 
    } 
} 

Ce qui se passe est l'étiquette ne se présente pas. Si je redimensionne l'écran de la droite à la plus petite possible, le texte apparaît soudainement, et il restera là si je redimensionne à ce qu'il était. Je n'ai aucune idée de ce qui se passe, cela semble vraiment être un bug pour moi.

Avant et après les captures d'écran: redimensionnement

before after

+0

Avez-vous essayé de définir un gestionnaire de disposition pour le JPanel? – resueman

+1

OK bien. Impossible de reproduire ici sur Windows 7, en utilisant une variante récente de Java 7. Quelle version de Java montre le problème ici? BTW - la machine a-t-elle une carte graphique nVidia? –

+0

@AndrewThompson Windows 8, Java 8, et oui nVidia GeForce GT 635M – Cruncher

Répondre

2

Malgré tous vos efforts, vous n'êtes pas sur le EventDispatchThread lorsque vous créez votre JLabel (ou JSlider, pour cette matière). Pour tester, je sous-classé JLabel juste voir si le code était sur le EDT quand il constructeur de s'appelle:

import java.awt.*; 
    import javax.swing.*; 

    public class Broken { 
     JLabel value = new XLabel(); // called before constructor, so not on EDT 
     JSlider slider = new JSlider(0, 255, 0); // same here 

     public Broken() { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      JPanel panel = new JPanel(); 
      value.setText("Some Value"); 
      panel.add(value); 
      JFrame frame = new JFrame("Frame Name"); 
      frame.setLayout(new GridLayout(2, 1)); 
      frame.add(panel); 
      frame.add(slider); 
      frame.pack(); 
      frame.setVisible(true); 
      } 
     }); 
     } 

     public static void main(String[] args) { 
     new Broken(); 
     } 

     class XLabel extends JLabel { 
     public XLabel() { 
      super(); 
      System.out.println("EDT? " + SwingUtilities.isEventDispatchThread()); 
     } 
     } 
    } 

Pour fixer, placez l'appel invokeLater dans le principal, de manière à envelopper toute la construction de votre classe sur la EDT:

import java.awt.*; 
import javax.swing.*; 

public class Broken2 { 
    JLabel value = new JLabel(); 
    JSlider slider = new JSlider(0, 255, 0); 

    public Broken2() { 
    JPanel panel = new JPanel(); 
    value.setText("Some Value"); 
    panel.add(value); 
    JFrame frame = new JFrame("Frame Name2"); 
    frame.setLayout(new GridLayout(2, 1)); 
    frame.add(panel); 
    frame.add(slider); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    public static void main(String[] args) { 

    // Generally the proper way. Create Whole app on EDT 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     new Broken2(); 
     } 
    }); 
    } 
} 
+0

C'est intéressant, et merci pour votre message (+1), mais ça ne marche toujours pas pour moi. Je soupçonne que c'est le problème du pilote mentionné par Andrew, toujours en train de télécharger un pilote mis à jour – Cruncher