繁体   English   中英

如何让 JPanel 在“Windows 装饰”保持开启的情况下填充完整的 JFrame(同时处于最大化状态)?

[英]How to let the JPanel fill the complete JFrame (while in maximized state) with the "Windows Decoration" kept ON?

我的全图 window

JFrame灰色边框可见

问题:

我希望我的应用程序在默认情况下以全屏(最大化)方式运行(但默认情况下最大分辨率因笔记本电脑而异)。 我正在使用根据JPanel上用户计算机的大小和宽度缩放的背景图像。 但是随着装饰和调整大小功能的“开启”, JPanel并没有完全填满JFrame

我希望我的应用程序:

  1. 允许用户根据用途调整大小,图像也随之缩放
  2. 在最大化视图中(默认情况下: setExtendedState(JFrame.MAXIMIZED_BOTH); )图像覆盖整个JFrame (注意:无论是否使用JFrame ,对适用于所有设备的任何解决方案都很满意。)
  3. 如果可能的话,我的组件也会调整大小

我正在使用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 不在屏幕中央,而是向右移动。

将超过 JFrame 的 Jpanel 拉伸到更高的高度

但是当我尝试使用

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

对于JPanel ,它不起作用。

我也可以使用JLabel完成此操作,但我希望我的图像在任何设备(更大或更小的笔记本电脑,如 1920x1080 分辨率、1280x720 等)上以最大化或调整大小的视图工作时覆盖JFrame到整个区域

如果提供任何解决方案,即使有或没有JPanel的替代方法,我将不胜感激。 即使该应用程序能够在任何设备上全屏运行,图像覆盖它,我也会感到满意,暂时可以牺牲调整大小功能

预期的

BorderLayout (默认设置为JFrame )将自动执行您想要的操作,然后您只需根据需要调整背景的大小/位置。

null (“绝对”)布局确实不是一个好主意。

首先看看如何使用 BorderLayout 我还建议查看Working with ImagesGraphics2D的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM