我遇到Swing问题,只有在计算机显示器电源关闭时才会出现,但我的Swing应用程序继续在后台运行.看起来每当显示器关闭时,Swing/AWT都会取消所有绘画操作,导致GUI中的一些显示问题在显示器重新打开后立即可见.
例如,当我使用自定义JNI函数关闭监视器并随后打开一个简单的消息对话框时,当监视器重新打开时,消息对话框为空:

但它在下次重绘后正确绘制:

这是Swing的预期行为吗?有没有办法指示Swing即使显示器电源关闭也能继续绘制到屏幕上?
编辑:这是一个SSCCE:
package test;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class App {
public static void main(String[] args) throws Throwable {
System.out.println("***** Please turn off the monitor in the next 70 seconds *****");
Thread.sleep(1000L * 70);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Test");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的是64位Windows 7 Home Premium SP1和64位Java 1.6.0_24.
编辑2:这是另一个我体验"取消绘画操作"效果的程序:
package test;
import static com.mycompany.Util.turnOffMonitors;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel; …Run Code Online (Sandbox Code Playgroud) 我正在编写自己的API来执行SndVol系统实用程序的一些功能.我希望这个API的一部分能够设置给定音频会话的音量级别.
SndVol在"设备"面板上显示一个滑块,用户可以使用该滑块更改音频设备的主音量级别以及每个音频会话的滑块(在"应用程序"面板上),用于更改会话的音量级别:

如果我拖动其中一个音频会话的滑块手柄,则SndVol可以更改音频会话的音量级别.它是如何做到的?
我认为可以使用Windows Vista的Core Audio API,但我遇到的问题是虽然我能够使用一个设备迭代设备的音频会话IAudioSessionEnumerator,但IAudioSessionEnumerator只能让我访问IAudioSessionControl对象,但我需要该IAudioClient对象来获取一个ISimpleAudioVolume对象我可以用来设置音频会话音量级别.是否有可能获得与IAudioClient对象关联的IAudioSessionControl对象?
我有一个JButton我想将背景颜色改为白色.使用金属外观时,我可以达到预期的效果setBackground:

不幸的是,使用Windows LAF时"背景颜色"的概念是不同的; 背景颜色是按钮周围绘制的颜色:

我想使用Windows LAF,但允许将此按钮的颜色JButton更改为白色.我该怎么做呢?