JFrame不会出现红色背景

时间:2016-04-19 22:24:01

标签: java image swing paint jcomponent

运行Java程序时遇到奇怪的问题。 它旨在:

  1. 运行在bat文件中指定的外部应用程序并显示全屏壁纸
  2. 按下组合按钮时,
  3. “隐藏”壁纸一段时间
  4. 警告用户5秒后离开,以便他可以保存工作
  5. 当超时发生时再次显示全屏壁纸并从蝙蝠做其他一些事情
  6. 按下按钮组合时退出程序
  7. warinng用户实现显示全屏红框200ms 我正在使用可见功能来执行此操作。

    显示标准全屏帧丢弃颜色设置。但只有当我评论frame.setUndecorated(true)时。取消注释时,我在任务栏中只看到图标。

    另一方面,当我启动(使用BlueJ)时,只有可见功能 红框显示指定的时间。即使使用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) 
                {
                }
            });
        }
    }
    

1 个答案:

答案 0 :(得分: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 SwingHow to use Swing Timers将帮助您解决其他潜在问题

  

我把必要的代码放在可见的函数中。我可以看到框架但是颜色信息被丢弃了。感谢并发和计时器,但我认为问题没有连接到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处理事件队列,阻止它绘制或响应其他事件