2016-04-19 4 views
0

У меня странная проблема при запуске моей Java-программы. Он предназначен для:JFrame не отображается с красным фоном

  1. запустить внешнее приложение, указанного в летучей мыши файл и отобразить полноэкранный обои
  2. обои «шкура» в течение некоторого времени, когда кнопка сочетание прессованного
  3. предупреждает пользователь о том, 5се влево, чтобы он мог сохранить работу
  4. , когда тайм-аут дисплея снова встречается, полноэкранное обои и сделать некоторые другие вещи из летучих мышей
  5. бросить курить программы, когда комбинация нажата кнопка

warinng пользователь реализован как отображение полноэкранного красного окна на 200 мс Я использую видимый функция для этого.

В нем отображаются стандартные настройки цвета в полноэкранном режиме. но только когда я прокомментирую frame.setUndecorated(true). при раскомментировании я вижу только значок на панели задач.

С другой стороны, когда я запускаю (используя BlueJ), только функция видна красная рамка отображается для указанного количества времени. Просто автономная функция работает отлично (в моем oppinion), даже если используется frame.setUndecorated(true).

что может быть неправильным, что я не могу запустить эту красную рамку в полноэкранном режиме?

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

ответ

2

Я предположил бы, что вы будете иметь, чтобы сделать что-то здесь ...

public class alertApp { 

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

Это вызывается, когда ваши программы начинается и где вы должны поместите код, чтобы запустить программу

Я бы также настоятельно рекомендовал вам взглянуть на Code Conventions for the Java TM Programming Language, это облегчит людям чтение вашего кода и лет у читать другие

Как Concurrency in Swing и How to use Swing Timers, которые помогут вам решить другие потенциальные проблемы

Я поставил код в необходимом видимой Funciton. Я вижу рамку, но цветная информация отбрасывается. Спасибо за параллельности и таймеры, но я думаю, что проблема не связана с Thread.sleep()

Тогда вы не читали ссылки ...

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 выполняются в пределах контекст Диспетчерского потока событий, поэтому, когда вы вызываете Thread.sleep, он не позволяет EDT обрабатывать очередь событий, не позволяя ей рисовать или отвечать на другие события.

+0

извините за условное обозначение кода. Я внес некоторые изменения, и теперь я использую только один класс. Я поместил необходимый код в ** видимый ** funciton. Я вижу рамку, но цветная информация отбрасывается.Спасибо за параллелизм и таймеры, но я думаю, что проблема не связана с 'thread.sleep()' – nightwissh

+0

Я не понимаю. почему он не может выполнить живопись, если напр. команда 'System.out.printf (« test »)' может отображаться перед вызовом функции ** visible ** и после вызова? Я могу даже поместить эту команду в каждое место в функции, и все они выполняются. Любая другая команда работает, но изменение цвета или удаление заголовка слишком много? – nightwissh

+0

Потому что это все о потоках. 'System.out' не зависит от EDT, поскольку он смог произвести его вывод. Все графические функции, поэтому, когда используется «Thread.sleep», поток, который обычно будет обрабатывать события обработки (и другие события), останавливается (спящий). Из-за того, как работает API, вы можете получить пустое изображение на экране, это основная обработка ОС, это конец запроса, но для Java/Swing, чтобы иметь возможность рисовать на нем, он должен иметь возможность реагировать на события окраски были помещены в очередь событий. – MadProgrammer