JFrame 不显示红色背景

JFrame doesn't appear with red background

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

  1. 运行在bat文件中指定外部应用并显示全屏壁纸
  2. "hide" 按下组合键时壁纸一段时间
  3. 警告用户还剩 5 秒以便他可以保存工作
  4. 当超时发生时再次显示全屏壁纸并从 bats 做一些其他事情
  5. 按下组合键时退出程序

警告用户实现为显示全屏红框200ms 我正在使用 visible 函数来执行此操作。

它显示了标准的全屏框架去色设置。但只有当我发表评论时 frame.setUndecorated(true)。取消注释时,我在任务栏中只看到图标。

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

我无法全屏启动那个红框是怎么回事?

olympicApp class:

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
    }
}

当您的程序启动时以及您应该将代码放在哪里以获取程序时调用此方法运行

我也强烈建议你看一看Code Conventions for the Java TM Programming Language,它会让人们更容易阅读你的代码,你也更容易阅读其他人

以及Concurrency in Swing and How to use Swing Timers这将帮助您解决其他潜在问题

I put neccessary code in visible funciton. I can see the frame but color information is discarted. Thanks for Concurrency and Timers, but I think the problem isn't connected to 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是在Event Dispatching Thread的上下文中执行的,所以当你调用Thread.sleep时,它会阻止EDT处理Event Queue,阻止它绘制或响应其他事件