Java JFrame不';t以红色背景显示

Java JFrame不';t以红色背景显示,java,image,swing,paint,jcomponent,Java,Image,Swing,Paint,Jcomponent,我在运行Java程序时遇到了一个奇怪的问题。 其设计目的是: 运行bat文件中指定的外部应用程序并显示全屏壁纸 按下组合按钮时“隐藏”壁纸一段时间 警告用户还剩5秒,以便他可以保存工作 当超时发生时,再次显示全屏壁纸,并从蝙蝠身上执行其他操作 按下组合按钮时退出程序 warinng用户实现为全屏显示红色方框200毫秒 我正在使用visible函数来执行此操作 它显示标准的全屏帧讨论颜色设置。但仅当我注释frame.setUndercorated(true)时。未注释时,我在任务栏中只看到图标 另

我在运行Java程序时遇到了一个奇怪的问题。 其设计目的是:

  • 运行bat文件中指定的外部应用程序并显示全屏壁纸
  • 按下组合按钮时“隐藏”壁纸一段时间
  • 警告用户还剩5秒,以便他可以保存工作
  • 当超时发生时,再次显示全屏壁纸,并从蝙蝠身上执行其他操作
  • 按下组合按钮时退出程序
  • warinng用户实现为全屏显示红色方框200毫秒 我正在使用visible函数来执行此操作

    它显示标准的全屏帧讨论颜色设置。但仅当我注释
    frame.setUndercorated(true)
    时。未注释时,我在任务栏中只看到图标

    另一方面,当我启动(使用BlueJ)时,只有功能可见 红色边框将在指定的时间内显示。即使使用了
    frame.setUndecorated(true)
    ,简单的独立函数也能完美地工作(在我看来)

    我不能全屏启动那个红框会有什么问题

    奥林匹卡班级:

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

    我想你得在这里做点什么

    public class alertApp {
    
        public static void main(String[] args) {
            // Sample loop to flash every 2 seconds
        }
    }
    
    当你的程序启动时调用它,你应该把代码放在哪里让程序运行

    我还极力建议您看一看,它将使人们更容易阅读您的代码,您也更容易阅读他人的代码

    以及,这将帮助您解决其他潜在问题

    我把必要的代码放在可见函数中。我可以看到框架,但颜色信息不清楚。感谢您提供的并发性和计时器,但我认为问题与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) {
                }
            }
        }
    

    按键
    在事件调度线程的上下文中执行,因此当您调用
    Thread.sleep
    时,它会阻止EDT处理事件队列,阻止它绘制或响应其他事件

    我想您必须在这里做些什么

    public class alertApp {
    
        public static void main(String[] args) {
            // Sample loop to flash every 2 seconds
        }
    }
    
    当你的程序启动时调用它,你应该把代码放在哪里让程序运行

    我还极力建议您看一看,它将使人们更容易阅读您的代码,您也更容易阅读他人的代码

    以及,这将帮助您解决其他潜在问题

    我把必要的代码放在可见函数中。我可以看到框架,但颜色信息不清楚。感谢您提供的并发性和计时器,但我认为问题与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处理事件队列,阻止它绘制或响应其他事件

    对于代码约定,我们深表歉意。我做了一些更改,现在我只使用一个类。我把必要的代码放在可见函数中。我可以看到框架,但颜色信息不清楚。感谢您提供的并发性和计时器,但我认为问题与
    thread.sleep()无关。
    我不明白。如果可以在调用visible函数之前和调用之后显示ex.command
    System.out.printf(“测试”)
    ,为什么它不能执行绘制?我甚至可以把这个命令放在函数中的每个地方,所有的命令都会执行。其他每一个命令都可以工作,但更改颜色或删除标题栏太多了?因为这都是关于线程的
    System.out
    不依赖EDT来生成其输出。所有的图形功能都是,所以当
    Thread.sleep
    被使用时,通常是进程绘制事件(和其他事件)的线程被停止(sleep)。由于API的工作方式,您可以在屏幕上看到一个空白,这是本机操作系统处理它的请求结束,但是为了让Java/Swing能够对其进行绘制,它需要能够响应已放入事件队列的绘制事件。。。非常感谢。这改变了我的观点。遗憾的是,还有更多的工作要做——很抱歉关于代码约定。我做了一些更改,现在我只使用一个类。我把必要的代码放在可见函数中。我可以看到框架,但颜色信息不清楚。感谢您提供的并发性和计时器,但我认为问题与
    thread.sleep()无关。
    我不明白。如果可以在调用visible函数之前和调用之后显示ex.command
    System.out.printf(“测试”)
    ,为什么它不能执行绘制?我甚至可以把这个命令放在函数中的每个地方,所有的命令都会执行。其他每一个命令都可以工作,但更改颜色或删除标题栏太多了?因为这都是关于线程的
    System.out
    不依赖EDT来生成其输出。所有的图形功能都是,所以当
    Thread.sleep
    被使用时,通常是进程绘制事件(和其他事件)的线程被停止(sleep)。由于API的工作方式,您可以在屏幕上看到一个空白,这是本机操作系统处理它的请求结束,但是为了让Java/Swing能够对其进行绘制,它需要能够响应已放入事件队列的绘制事件。。。非常感谢。这改变了我的观点。遗憾的是,还有更多的工作要做-