[英]How to let the JPanel fill the complete JFrame (while in maximized state) with the "Windows Decoration" kept ON?
我希望我的应用程序在默认情况下以全屏(最大化)方式运行(但默认情况下最大分辨率因笔记本电脑而异)。 我正在使用根据JPanel
上用户计算机的大小和宽度缩放的背景图像。 但是随着装饰和调整大小功能的“开启”, JPanel
并没有完全填满JFrame
。
我希望我的应用程序:
setExtendedState(JFrame.MAXIMIZED_BOTH);
)图像覆盖整个JFrame
(注意:无论是否使用JFrame
,对适用于所有设备的任何解决方案都很满意。)我正在使用JFrame
处于“绝对布局”。 我在绝对布局和BorderLayout
(不起作用)上都尝试过JPanel
,尝试过pack()
(也不起作用),屏幕尺寸的jPanel1.setSize(WIDTH,HEIGHT)
也不起作用。 将JPanel
的布局设置为 NULL 也没有解决问题:(
Sign_Up.java ( JFrame
)
public class Sign_Up extends javax.swing.JFrame {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
/**
* Creates new form Sign_Up
*/
public Sign_Up() {
initComponents();
Seticon();
btnSave.setEnabled(false);//save button
setExtendedState(JFrame.MAXIMIZED_BOTH);
//setSize(1920,1080);
setLocationRelativeTo(null);//makes aligned at center of screen
//jPanel1.setSize((int)width, (int)height);
//pack();
}
PanelScale.java
public class PanelScale extends JPanel {
Image iconbg;
public PanelScale() {
iconbg = new ImageIcon(getClass( ).getResource("/images/largesignup.png")).getImage( );
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gd = (Graphics2D)g.create();
gd.drawImage(iconbg, 0, 0, getWidth(), getHeight(), this);
gd.dispose();
}
}
JPanel
中的自定义创建代码: new Panel.PanelScale();
我发现唯一可行的是将JPanel
显式拉伸到JFrame
上的某个额外高度(在 NetBeans 中),但这导致我的应用程序 window 不在屏幕中央,而是向右移动。
但是当我尝试使用
setsize(new Dimension(width, height+40));
对于JPanel
,它不起作用。
我也可以使用JLabel
完成此操作,但我希望我的图像在任何设备(更大或更小的笔记本电脑,如 1920x1080 分辨率、1280x720 等)上以最大化或调整大小的视图工作时覆盖JFrame
到整个区域
如果提供任何解决方案,即使有或没有JPanel
的替代方法,我将不胜感激。 即使该应用程序能够在任何设备上全屏运行,图像覆盖它,我也会感到满意,暂时可以牺牲调整大小功能
BorderLayout
(默认设置为JFrame
)将自动执行您想要的操作,然后您只需根据需要调整背景的大小/位置。
null
(“绝对”)布局确实不是一个好主意。
首先看看如何使用 BorderLayout 。 我还建议查看Working with Images和Graphics2D
的 JavaDocs,它们将为您提供有关如何根据需要调整图像大小的信息
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame frame = new JFrame();
frame.add(new BackgroundPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public class BackgroundPane extends JPanel {
private BufferedImage backgroundImage;
public BackgroundPane() throws IOException {
backgroundImage = ImageIO.read(getClass().getResource("/images/Mando01.jpeg"));
}
@Override
public Dimension getPreferredSize() {
if (backgroundImage == null) {
return new Dimension(400, 400);
}
return new Dimension(backgroundImage.getWidth(), backgroundImage.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (backgroundImage == null) {
return;
}
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this);
g2d.dispose();
}
}
}
不使用JPanel.setSize()
,而是将 JFrame 的 LayoutManager 设置为null
。 每次更改 window 大小时,使用JPanel.setBounds(0,0,windowWidth,windowHeight)
方法调整 JPanel 的大小。 您可能必须调用repaint()
方法来重新绘制屏幕上的组件。
// Create a window with a size of 300x200
JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(300, 200);
frame.setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(0, 0, 300, 200);
panel.setBackground(Color.BLACK);
frame.add(panel);
frame.setVisible(true);
// Resize the window to 600x400
frame.setSize(600, 400);
panel.setBounds(0, 0, 600, 400); // Update panel size
panel.repaint(); // Repaint the components
如果删除最后两行代码,您会注意到大小没有改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.