java 如何让JPanel填充完整的JFrame(当处于最大化状态时)并保持“Windows装饰”为ON?

xcitsw88  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(309)

Full image of my window
The grey border of JFrame visible

问题:

我希望我的应用程序在默认情况下全屏运行(最大化)(但是不同笔记本电脑的默认最大分辨率不同)。我在JPanel上使用了一个根据用户电脑的大小和宽度缩放的背景图像。但是随着装饰和调整大小功能的“打开”,JPanel并没有完全填满JFrame
我希望我的应用程序:
1.允许用户根据使用情况调整其大小,并沿着其缩放图像
1.在最大化视图中(默认情况下:setExtendedState(JFrame.MAXIMIZED_BOTH);),图像覆盖整个JFrame(注:无论是否使用JFrame,只要解决方案能在所有设备上运行,我都很满意。)
1.如果可能,我的组件也会调整大小
我正在使用NetBeans,JFrame处于“绝对布局”。我尝试了JPanel的绝对布局和BorderLayout(不起作用),尝试了pack()(也不起作用),jPanel1.setSize(WIDTH,HEIGHT)与屏幕的尺寸也不起作用。将JPanel的布局设置为NULL也不能解决问题:(
注册. 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();
我发现唯一起作用的是显式地将JPanelJFrame上拉伸到一些额外的高度(在NetBeans中),但这导致我的应用程序窗口不在屏幕的中心,而是向右移动。
Stretching the Jpanel Over JFrame to some more height
但当我尝试用

setsize(new Dimension(width, height+40));

对于JPanel,它不起作用。
此外,我可以使用JLabel来完成此操作,但我希望我的图像能够覆盖JFrame的全部区域,同时在任何设备(更大或更小的笔记本电脑,如1920x1080分辨率,1280x720等)上以最大化或调整大小的视图工作。
如果提供任何解决方案,即使是一些有或没有JPanel的替代方式,我将不胜感激。即使应用程序能够在任何设备上全屏工作,图像覆盖它,我会很满意,调整大小功能可以暂时牺牲
Expected

9rbhqvlz

9rbhqvlz1#

BorderLayout(这是默认设置的JFrame)将完全自动做你想要的,你只需要根据你的需要调整/定位背景。
null(“绝对”)布局确实不是一个好主意。
首先看一下How to Use BorderLayout。我还建议看一下Working with ImagesJavaDocs for Graphics2D,它们将为您提供如何根据需要调整图像大小的信息

可运行示例...

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();
        }

    }
}
kadbb459

kadbb4592#

不要使用JPanel.setSize(),而是将JFrame的LayoutManager设置为null。每次更改窗口大小时,都要使用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

代码的结果如下:

如果删除代码的最后两行,您会注意到大小没有改变。

相关问题