是否可能有一个覆盖Windows任务栏的非全屏Java应用程序?

是否可能有一个覆盖Windows任务栏的非全屏Java应用程序?,java,java-8,jframe,Java,Java 8,Jframe,我正在尝试创建一个应用程序,它使用两个JFrame,每个JFrame占据一半屏幕。但我希望实现的是两个独立画面的“全屏”效果 我尝试过各种方法,比如使用JFrameAPI的toFront方法等等,但仍然不可行 当用户与我的应用程序交互时,他们可以打开表单,即使单击jframe,表单也必须始终位于顶部。当前,如果我将alwaysOnTop设置为true,当我单击jframe时,表单将被推回到框架后面 这组代码(TestApp2)显示了我想要实现的全屏效果,即覆盖Windows任务栏 package

我正在尝试创建一个应用程序,它使用两个JFrame,每个JFrame占据一半屏幕。但我希望实现的是两个独立画面的“全屏”效果

我尝试过各种方法,比如使用JFrameAPI的toFront方法等等,但仍然不可行

当用户与我的应用程序交互时,他们可以打开表单,即使单击jframe,表单也必须始终位于顶部。当前,如果我将alwaysOnTop设置为true,当我单击jframe时,表单将被推回到框架后面

这组代码(TestApp2)显示了我想要实现的全屏效果,即覆盖Windows任务栏

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您也可以使弹出窗体始终位于顶部,这将有望使它出现在其他窗口之前。顺便问一下,为什么要有两帧呢?为什么不能有一个带有两个面板的单框架?不幸的是,这个解决方案不适合我的情况,解释见上面的评论部分