我(仍)是Java的初学者,我创建了一个包含主框架的小软件。
我需要覆盖我软件背后的所有桌面,例如Windows 98安装屏幕:(我需要黑屏和蓝屏,包括所有任务栏等)。
为了做到这一点,我使用了全屏幕的GraphicsDevice。这正是我所需要的:
public class Fond_noir extends JFrame { private boolean isFullScreen = false; private GraphicsDevice device; public Fond_noir(int etat) { GraphicsEnvironment env = GraphicsEnvironment .getLocalGraphicsEnvironment(); this.device = env.getDefaultScreenDevice(); initFullScreen(etat); } private void initFullScreen(int etat) { isFullScreen = device.isFullScreenSupported(); if (etat==0) { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); } if (etat==1) { setDefaultCloseOperation(DISPOSE_ON_CLOSE); } setUndecorated(isFullScreen); setResizable(!isFullScreen); if (isFullScreen) { // Full-screen mode device.setFullScreenWindow(this); validate(); } else { // Windowed mode this.setExtendedState(MAXIMIZED_BOTH); this.setVisible(true); } } }
然后,我把这个方法称为主要的其他地方,(这没有问题):
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Fond_noir(0);
Choix_Langue inst = new Choix_Langue(); // main frame
inst.setLocationRelativeTo(null);
inst.setVisible(true);
} } ); }
但问题是,我的主框架无法显示,而且它隐藏在我的全屏幕后面......我喜欢相反的情况! 或者当我点击我的任务栏中的主框架时(使用我的键盘的窗口键...)我只能看到我的主框架,并且全屏幕没有显示框架
=>有没有办法显示我的框架和我的GraphicsDevice?使用"优先级"他们之间..?
感谢阅读!
答案 0 :(得分:4)
使用此:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setAlwaysOnTop(true)
未修饰将删除标题栏。而不是试图单独显示两个框架。将较小的一个添加到较大的一个。
bigFrame.add(smallFrame);
bigFrame.setVisible(true);
示例表明它有效:
答案 1 :(得分:3)
我不确定您是否需要使用全屏独占模式,例如,您可以调整无边框的大小以适应默认屏幕大小,并使其始终位于顶部以帮助它覆盖系统中的所有其他窗口然后只需使用JDialog
作为主要界面来与用户合作,例如......
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.LinearGradientPaint;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class FullScreenBackground {
public static void main(String[] args) {
new FullScreenBackground();
}
public FullScreenBackground() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
JFrame frame = new JFrame("Testing");
frame.setAlwaysOnTop(true);
frame.setUndecorated(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new BackgroundPane());
frame.setLocation(0, 0);
frame.setSize(dim);
frame.setVisible(true);
JDialog dialog = new JDialog(frame);
dialog.setContentPane(new InstallPane());
dialog.pack();
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
}
});
}
public class InstallPane extends JPanel {
public InstallPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(new JLabel("<html><h1>Welcome to my fancy pancy background screen<h1></html>"), gbc);
}
}
public class BackgroundPane extends JPanel {
private BufferedImage bg;
public BackgroundPane() {
}
@Override
public void invalidate() {
super.invalidate();
bg = null;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (bg == null) {
bg = new BufferedImage(1, getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bg.createGraphics();
LinearGradientPaint lgp = new LinearGradientPaint(
new Point(0, 0),
new Point(0, getHeight()),
new float[]{0f, 1f},
new Color[]{Color.BLACK, Color.BLUE}
);
g2d.setPaint(lgp);
g2d.fillRect(0, 0, 1, getHeight());
}
g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
}
}
}
<强>更新强>
如果更改所有“框架”并不难,您可以考虑对上述示例进行以下更改......
JFrame frame = new JFrame("Testing");
frame.setAlwaysOnTop(true);
frame.setUndecorated(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new BackgroundPane());
frame.setLocation(0, 0);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setSize(dim);
// This will stop the background window from become focused,
// potentially hiding the other windows
frame.setFocusableWindowState(false);
frame.setFocusable(false);
frame.setVisible(true);
JFrame dialog = new JFrame();
// Will need to add this to each frame...
dialog.setAlwaysOnTop(true);
dialog.setContentPane(new InstallPane());
dialog.pack();
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
您可能面临的另一个问题是alwaysOnTop
与平台有关,这意味着它可能在不同平台上的行为方式不同。
将extends JFrame
更改为extends JDialog
确实会更简单,更稳定地进行更改......
答案 2 :(得分:0)
我找到了所有答案的解决方案。
我没有使用另一个框架,而是使用JWindow作为背景:
public class Fond_noir extends JWindow{
Panel panel = new Panel();
public Fond_noir(int etat) {
if (etat==0)
{
setSize(2300,4000);
setLocationRelativeTo(null);
setVisible(true);
}
if (etat==1)
{
dispose();
}
panel.setBackground(Color.black);
add(panel);
}
class Panel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
}
}
}
然后在尝试将我的主框架的“扩展JFrame”更改为“extends JDialog”时,它让我在代码中删除了这条可怕的行:this.setState(Frame.ICONIFIED); !!!! 它解释了为什么我必须一直寻找我的图标..所以我保留了我的JFrame .. 所以现在它同时打开一个背景窗口和框架:)
谢谢大家!下次我不会使用那么多帧。