2016-04-19 4 views
0

J'ai un problème étrange lors de l'exécution de mon programme Java. Il est conçu pour:JFrame n'apparaît pas avec un fond rouge

  1. run application externe spécifié dans le fichier de chauve-souris et afficher fond d'écran plein écran
  2. « cacher » fond d'écran pendant un certain temps lorsque vous appuyez sur la combinaison pressée
  3. mettent en garde l'utilisateur qui 5sec gauche afin qu'il puisse sauver le travail
  4. lorsque délai d'attente à nouveau l'affichage plein écran occures fond d'écran et faire quelques autres trucs de chauves-souris
  5. Quitte le programme lorsque la combinaison de bouton pressé

l'utilisateur warinng est réalisé comme affichant la boîte rouge plein écran pendant 200ms J'utilise visible fonction pour ce faire.

Il affiche les paramètres standard de couleur d'évitement de trame plein écran. mais seulement quand je commente frame.setUndecorated(true). quand je ne suis pas comment, je ne vois que l'icône dans la barre des tâches.

D'autre part, lorsque je lance (en utilisant BlueJ) seulement la fonction visible le cadre rouge est affiché pendant la durée spécifiée. Fonction simplement autonome fonctionne parfaitement (dans mon oppinion) même si frame.setUndecorated(true) est utilisé.

qu'est-ce qui ne va pas que je ne peux pas lancer ce cadre rouge en plein écran?

classe olympicApp:

import java.awt.*; 
import java.awt.Color; 
import java.awt.event.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.Graphics; 
import java.awt.image.*; 
import java.io.*; 
import java.io.IOException; 
import javax.imageio.*; 
import javax.swing.*; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JComponent; 

public class olympicApp extends JComponent { 
    alertApp alert; 
    BufferedImage img; 
    public olympicApp() 
    { 
     try 
     { 
      img = ImageIO.read(new File("wallpaper.jpg")); 
     } 
     catch (IOException e) 
     { 
     } 
    } 

    public void paint(Graphics g) 
    { 
     g.drawImage(img, 0, 0, null); 
    } 

    public Dimension getPreferredSize() 
    { 
     if (img == null) 
     { 
      return new Dimension(200,200); 
     } 
     else 
     { 
      return new Dimension(img.getWidth(null), img.getHeight(null)); 
     } 
    } 

    public static void visible() 
    { 
     JFrame frame = new JFrame(); 
     frame.getContentPane().setBackground(Color.red); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.dispose(); 
     //frame.setUndecorated(true); 
     frame.setAlwaysOnTop(true); 
     frame.pack(); 
     frame.setVisible(true); 
     try 
     { 
      frame.setVisible(true); 
      Thread.sleep(500); 
      frame.setVisible(false); 
     } 
     catch(Exception ex) 
     { 
     } 
     frame.setAlwaysOnTop(false); 
     frame.setVisible(false); 
    } 

    public static void main(String[] args) 
    { 
     //alertApp reminder = new alertApp(); 
     try 
     { 
      Process process = Runtime.getRuntime().exec("start-lv.bat"); 
      Thread.sleep(500); 
     } 
     catch (IOException | InterruptedException e) 
     { 
     } 
     JFrame f = new JFrame("olympic"); 
     f.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     f.setUndecorated(true); 
     f.setAlwaysOnTop(true);  
     f.addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
       System.exit(0); 
      } 
     }); 
     f.add(new olympicApp()); 
     f.pack(); 
     f.setVisible(true); 
     f.addKeyListener(new KeyListener() 
     { 
      public void keyPressed(KeyEvent kevt) 
      { 
       if(kevt.getKeyChar()=='l') 
       { 
        if(kevt.isAltDown()) 
        { 
         f.setAlwaysOnTop(false); 
         f.setVisible(false); 
         try 
         { 
          Thread.sleep(5*1000); 
          visible(); 
          Thread.sleep(5*1000); 
          //Process process = Runtime.getRuntime().exec("saving.bat"); 
          Thread.sleep(500); 
          f.setAlwaysOnTop(true); 
          f.setVisible(true); 
          Process process2 = Runtime.getRuntime().exec("kopia.bat"); 
         } 
         catch(IOException | InterruptedException e) 
         { 
         } 
        }     
       } 

       if(kevt.getKeyChar()=='q') 
       { 
        if(kevt.isAltDown()) 
        { 
         System.exit(0); 
        }     
       } 
      } 

      public void keyTyped(KeyEvent kevt) 
      { 
      } 

      public void keyReleased(KeyEvent kevt) 
      { 
      } 
     }); 
    } 
} 

Répondre

2

Je suppose que vous allez devoir faire quelque chose ici ...

public class alertApp { 

    public static void main(String[] args) { 
     // Sample loop to flash every 2 seconds 
    } 
} 

Ceci est appelé au démarrage de votre programme et où vous devriez mettre le code pour faire fonctionner le programme

Je voudrais également recommander strogly que vous jetez un oeil à Code Conventions for the Java TM Programming Language, il va le rendre plus facile pour les gens à lire votre code et pour yo u pour lire d'autres

En plus Concurrency in Swing et How to use Swing Timers qui vous aideront à résoudre d'autres problèmes potentiels

Je mets le code neccessary dans funciton visible. Je peux voir le cadre mais les informations de couleur sont discartées. Merci pour Concurrency et minuteries, mais je pense que le problème est pas connecté à Thread.sleep()

Alors vous n'avez pas lu les liens ...

public void keyPressed(KeyEvent kevt) { 
    if (kevt.getKeyChar() == 'l') { 
     if (kevt.isAltDown()) { 
      f.setAlwaysOnTop(false); 
      f.setVisible(false); 
      try { 
       Thread.sleep(5 * 1000); 
       visible(); 
       Thread.sleep(5 * 1000); 
       //Process process = Runtime.getRuntime().exec("saving.bat"); 
       Thread.sleep(500); 
       f.setAlwaysOnTop(true); 
       f.setVisible(true); 
       Process process2 = Runtime.getRuntime().exec("kopia.bat"); 
      } catch (IOException | InterruptedException e) { 
      } 
     } 
    } 

keyPressed est exécuté dans le contexte de l'événement Dispatching Thread, donc quand vous appelez Thread.sleep, il empêche l'EDT de traiter la file d'attente des événements, l'empêchant de peindre ou de répondre à d'autres événements

+0

bien désolé de la convention de code. J'ai fait quelques changements, et maintenant je n'utilise qu'un seul cours. Je mets le code nécessaire dans la fonction ** visible **. Je peux voir le cadre mais les informations de couleur sont discartées.Merci pour Concurrency et Timers, mais je pense que le problème n'est pas connecté à 'thread.sleep()' – nightwissh

+0

Je ne comprends pas. pourquoi il ne peut pas effectuer de peinture si par ex. La commande 'System.out.printf (" test ")' peut être affichée avant d'appeler la fonction ** visible ** et après l'appel? Je peux même mettre cette commande dans tous les lieux en fonction, et tous exécutés. Toutes les autres commandes fonctionnent, mais changer de couleur ou supprimer la barre de titre est trop? – nightwissh

+0

Parce que tout est question de threads. 'System.out' ne dépend pas de l'EDT pour avoir été capable de produire sa sortie. Toutes les fonctionnalités graphiques sont donc, alors que 'Thread.sleep' est utilisé, le thread qui serait normalement le processus de peinture des événements (et d'autres événements) est arrêté (dormant). En raison du fonctionnement de l'API, vous pouvez obtenir un blanc à l'écran, c'est le système d'exploitation natif qui traite la fin de la requête, mais pour que Java/Swing puisse y peindre, il doit pouvoir répondre aux événements de peinture ont été placés dans la file d'attente des événements. – MadProgrammer