是否可能有一个覆盖Windows任务栏的非全屏Java应用程序?
我正在尝试创建一个应用程序,它使用两个JFrame,每个JFrame占据一半屏幕。但我希望实现的是两个独立画面的“全屏”效果 我尝试过各种方法,比如使用JFrameAPI的toFront方法等等,但仍然不可行 当用户与我的应用程序交互时,他们可以打开表单,即使单击jframe,表单也必须始终位于顶部。当前,如果我将alwaysOnTop设置为true,当我单击jframe时,表单将被推回到框架后面 这组代码(TestApp2)显示了我想要实现的全屏效果,即覆盖Windows任务栏是否可能有一个覆盖Windows任务栏的非全屏Java应用程序?,java,java-8,jframe,Java,Java 8,Jframe,我正在尝试创建一个应用程序,它使用两个JFrame,每个JFrame占据一半屏幕。但我希望实现的是两个独立画面的“全屏”效果 我尝试过各种方法,比如使用JFrameAPI的toFront方法等等,但仍然不可行 当用户与我的应用程序交互时,他们可以打开表单,即使单击jframe,表单也必须始终位于顶部。当前,如果我将alwaysOnTop设置为true,当我单击jframe时,表单将被推回到框架后面 这组代码(TestApp2)显示了我想要实现的全屏效果,即覆盖Windows任务栏 package
package doubleframe;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class TestApp2 {
public static void main(String[] args) {
new TestApp2();
}
public TestApp2() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int height = screenSize.height;
int width = (screenSize.width);
JFrame frame1 = new JFrame();
frame1.setBounds(0, 0, width, height);
frame1.setUndecorated(true);
frame1.setVisible(true);
}
}
这组代码(TestApp)显示了我的应用程序的样子,但无法达到覆盖任务栏的效果
package doubleframe;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestApp {
private int size = 2;
public static void main(String[] args) {
new TestApp();
}
public TestApp() {
initFrames();
}
private void initFrames() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int height = screenSize.height;
int width = (screenSize.width / size);
JFrame frame1 = new JFrame();
frame1.setBounds(0, 0, width, height);
frame1.setUndecorated(true);
frame1.setVisible(true);
JPanel panel1 = new JPanel();
panel1.setBackground(Color.GREEN);
panel1.setBounds(0, 0, width, height);
frame1.getContentPane().add(panel1);
//frame 2
JFrame frame2 = new JFrame();
frame2.setBounds(width, 0, width, height);
frame2.setUndecorated(true);
frame2.setVisible(true);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.BLUE);
panel2.setBounds(width, 0, width, height);
frame2.getContentPane().add(panel2);
}
}
您可以将两个框架设置为始终位于顶部:
frame1.setAlwaysOnTop(true);
frame2.setAlwaysOnTop(true);
如果您仍然希望能够在这两个框架下将tab键切换到windows,则可以在每一个框架中添加一个WindowFocusListener
,这将在失焦时检查两个框架中是否有任何一个已聚焦,如果没有,则setAlwaysOnTop(false)
。同样地,您必须在焦点增益时启用它。但是,由于这些事件的触发顺序不同,这有点不太容易实现。下面是您的想法,但您可能需要改进:
WindowFocusListener listener = new WindowAdapter() {
AtomicBoolean switchingOff = new AtomicBoolean();
@Override
public void windowGainedFocus(WindowEvent e) {
if (!switchingOff.get() && !frame1.isAlwaysOnTop() && !frame2.isAlwaysOnTop()) {
SwingUtilities.invokeLater(() -> {
frame1.setAlwaysOnTop(true);
frame2.setAlwaysOnTop(true);
});
}
}
@Override
public void windowLostFocus(WindowEvent e) {
SwingUtilities.invokeLater(() -> {
if (!frame1.isFocused() && !frame2.isFocused()) {
switchingOff.set(true);
frame1.setAlwaysOnTop(false);
frame2.setAlwaysOnTop(false);
SwingUtilities.invokeLater(() -> switchingOff.set(false));
}
});
}
};
frame1.addWindowFocusListener(listener);
frame2.addWindowFocusListener(listener);
你试过
setAlwaysOnTop(true)
?@JaroslawPawlak是的,不幸的是它不适合我的情况。我忘了提到我的应用程序将有弹出窗体(例如,jpanel),当显示时,即使我单击jframes,它也会保持在顶部。@JU您也可以使弹出窗体始终位于顶部,这将有望使它出现在其他窗口之前。顺便问一下,为什么要有两帧呢?为什么不能有一个带有两个面板的单框架?不幸的是,这个解决方案不适合我的情况,解释见上面的评论部分