2016-04-19 27 views
0

Ich habe seltsames Problem bei der Ausführung meines Java-Programms. Es wurde entwickelt, um:JFrame erscheint nicht mit rotem Hintergrund

  1. externen Lauf App in Bat-Datei angegeben und Vollbild Tapete Anzeige
  2. „verstecken“ Tapete für einige Zeit, wenn die Tasten-Kombination gedrückt
  3. Benutzer warnen, dass 5Sek links, so kann er die Arbeit
  4. sparen
  5. wenn Timeout Anzeige wieder Vollbild Tapete occures und einige andere Sachen von Fledermäusen
  6. Programm beenden, wenn die Tastenkombination
gedrückt 210

Warinng Benutzer wird als Vollbild-Red Box für 200ms realisiert Ich benutze sichtbar Funktion, dies zu tun.

Es zeigt Standard-Vollbild-Frame Diskaring Farbeinstellungen. aber nur wenn ich frame.setUndecorated(true) kommentiere. Wenn sie nicht kommentiert wird, wird nur das Symbol in der Taskleiste angezeigt.

Auf der anderen Seite, wenn ich starte (mit BlueJ) nur Funktion sichtbar der rote Rahmen wird für die angegebene Zeit angezeigt. Die einfache Standalone-Funktion funktioniert perfekt (meiner Meinung nach) auch wenn frame.setUndecorated(true) verwendet wird.

Was kann falsch sein, dass ich diesen roten Rahmen im Vollbildmodus nicht starten kann?

olympicApp Klasse:

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) 
      { 
      } 
     }); 
    } 
} 

Antwort

2

Ich könnte mir vorstellen, dass Sie etwas zu tun, hier ...

public class alertApp { 

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

Diese haben werden wird aufgerufen, wenn das Programm startet und wo Sie sollten Setzen Sie den Code, um das Programm zu starten

Ich würde auch strogly empfehlen, dass Sie einen Blick auf Code Conventions for the Java TM Programming Language werfen, wird es leichter für die Menschen Ihren Code und für yo lesen u lesen andere

Neben Concurrency in Swing und How to use Swing Timers, die Sie andere potenzielle Probleme

Ich habe nötig Code in sichtbar funciton lösen helfen. Ich kann den Rahmen sehen, aber die Farbinformationen sind weggelassen. Vielen Dank für Concurrency und Timer, aber ich denke, das Problem nicht Thread.sleep verbunden ist()

Sie dann nicht die Links gelesen haben ...

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 innerhalb der ausgeführt wird, Kontext des Ereignis Dispatching Thread, so, wenn Sie Thread.sleep aufrufen, verhindert es die EDT Verarbeitung der Event Queue, verhindert, dass es zu malen oder auf andere Ereignisse reagieren

+0

tut mir leid, Code Convention. Ich habe einige Änderungen vorgenommen, und jetzt verwende ich nur eine Klasse. Ich habe den notwendigen Code in ** visible ** funciton eingefügt. Ich kann den Rahmen sehen, aber die Farbinformationen sind weggelassen.Danke für Nebenläufigkeit und Timer, aber ich denke, das Problem ist nicht mit 'thread.sleep()' verbunden. – nightwissh

+0

Ich verstehe es nicht. Warum kann es nicht malen, wenn zum Beispiel. Der Befehl 'System.out.printf (" test ")' kann vor Aufruf der ** visible ** Funktion und nach dem Aufruf angezeigt werden. Ich kann diesen Befehl sogar an jedem Ort in Funktion setzen und alle ausführen. Jeder andere Befehl funktioniert, aber die Farbe zu ändern oder Titelleiste zu entfernen ist zu viel? – nightwissh

+0

Weil es nur um Threads geht. 'System.out' ist nicht vom EDT abhängig, um die Ausgabe zu erzeugen. Die gesamte Grafikfunktionalität ist so, während "Thread.sleep" verwendet wird, wird der Thread, der normalerweise Prozessfarbenereignisse (und andere Ereignisse) sein würde, gestoppt (schlafend). Wegen der Art, wie die API funktioniert, können Sie eine leere Stelle auf dem Bildschirm erhalten, dies ist das native Betriebssystem, das das Ende der Anfrage verarbeitet, aber damit Java/Swing in der Lage ist, es zu malen, muss es in der Lage sein reagieren auf Paint-Events, die in die Event-Queue gestellt wurden. – MadProgrammer