Java JFrame不';t以红色背景显示
我在运行Java程序时遇到了一个奇怪的问题。 其设计目的是:Java JFrame不';t以红色背景显示,java,image,swing,paint,jcomponent,Java,Image,Swing,Paint,Jcomponent,我在运行Java程序时遇到了一个奇怪的问题。 其设计目的是: 运行bat文件中指定的外部应用程序并显示全屏壁纸 按下组合按钮时“隐藏”壁纸一段时间 警告用户还剩5秒,以便他可以保存工作 当超时发生时,再次显示全屏壁纸,并从蝙蝠身上执行其他操作 按下组合按钮时退出程序 warinng用户实现为全屏显示红色方框200毫秒 我正在使用visible函数来执行此操作 它显示标准的全屏帧讨论颜色设置。但仅当我注释frame.setUndercorated(true)时。未注释时,我在任务栏中只看到图标 另
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.commandSystem.out.printf(“测试”)
,为什么它不能执行绘制?我甚至可以把这个命令放在函数中的每个地方,所有的命令都会执行。其他每一个命令都可以工作,但更改颜色或删除标题栏太多了?因为这都是关于线程的System.out
不依赖EDT来生成其输出。所有的图形功能都是,所以当Thread.sleep
被使用时,通常是进程绘制事件(和其他事件)的线程被停止(sleep)。由于API的工作方式,您可以在屏幕上看到一个空白,这是本机操作系统处理它的请求结束,但是为了让Java/Swing能够对其进行绘制,它需要能够响应已放入事件队列的绘制事件。。。非常感谢。这改变了我的观点。遗憾的是,还有更多的工作要做——很抱歉关于代码约定。我做了一些更改,现在我只使用一个类。我把必要的代码放在可见函数中。我可以看到框架,但颜色信息不清楚。感谢您提供的并发性和计时器,但我认为问题与thread.sleep()无关。
我不明白。如果可以在调用visible函数之前和调用之后显示ex.commandSystem.out.printf(“测试”)
,为什么它不能执行绘制?我甚至可以把这个命令放在函数中的每个地方,所有的命令都会执行。其他每一个命令都可以工作,但更改颜色或删除标题栏太多了?因为这都是关于线程的System.out
不依赖EDT来生成其输出。所有的图形功能都是,所以当Thread.sleep
被使用时,通常是进程绘制事件(和其他事件)的线程被停止(sleep)。由于API的工作方式,您可以在屏幕上看到一个空白,这是本机操作系统处理它的请求结束,但是为了让Java/Swing能够对其进行绘制,它需要能够响应已放入事件队列的绘制事件。。。非常感谢。这改变了我的观点。遗憾的是,还有更多的工作要做-