JPanel的位置和大小根据屏幕大小而变化

该程序的大小根据屏幕分辨率或计算机的大小运行。 当我在一台具有特定尺寸显示器的电脑上运行它时,它会相应地改变。 我的问题是JPanel的位置和大小,或者框架内的任何对象,以改变屏幕大小。

因此,无论何时我将在任何尺寸不同的显示器上展示我的程序,组件仍然按照我最初的devise进行组织和布局。 但是在这里我用一个名为displayMenu的JPanel来testing它。 其中它显示了一个绿色的面板。

package saves.project; import com.sun.awt.AWTUtilities; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.BorderFactory; import javax.imageio.ImageIO; public class Homepage extends JFrame{ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Border grayline = BorderFactory.createLineBorder(Color.GRAY);; int width = screenSize.width, height = screenSize.height; public Homepage() throws IOException{ super("Homepage"); displayMenu(); displayBackground(); } public static BufferedImage resize(BufferedImage image, int width, int height) { BufferedImage bi = new BufferedImage(width, height, BufferedImage.TRANSLUCENT); Graphics2D g2d = (Graphics2D) bi.createGraphics(); g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); g2d.drawImage(image, 0, 0, width, height, null); g2d.dispose(); return bi; } public void displayBackground() throws IOException{ JPanel pBackground = new JPanel(); pBackground.setSize(screenSize); pBackground.setLayout(new FlowLayout()); add(pBackground); BufferedImage header = ImageIO.read(new File("res\\bg.jpg")); BufferedImage resizedImage = resize(header,width,height); ImageIcon image = new ImageIcon(resizedImage); JLabel lblheader = new JLabel(image, JLabel.CENTER); pBackground.add(lblheader); } public void displayMenu() { JPanel pTitle = new JPanel(); pTitle.setLayout(null); pTitle.setBounds(width/3, (height/2)+20, width/2, height/2); pTitle.setBackground(Color.GREEN); add(pTitle); } public void CreateAndShowGUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setExtendedState(JFrame.MAXIMIZED_BOTH); setUndecorated(true); setVisible(true); } } 

另外,它看起来像我的背景并没有完全传遍整个框架。 顶部有一条白线,其余的是背景。 我该怎么办? 感谢帮助!

跟进@MadProgrammer评论:

你真的需要学习如何使用布局pipe理器。 设置大小不是要走的路,因为它们将在不同的机器上执行不同的操作。

关于布局pipe理器的一个重要的事情是哪个布局尊重其内部组件的首选大小。 不尊重尺寸的,会拉伸组件。 一些布局可能不能拉伸它们的组件,但是当拉伸主容器时,将它们放置在开放空间内的默认位置。

为了获得期望的结果,有时还需要使用不同的布局来嵌套容器,这利用了两个或更多的布局。

我知道这不是对你的问题的真正答案,但是我认为你仍然可以通过使用布局pipe理器来了解你的问题,以及如何实现你想要的。

下面我刚刚构build了一些主要布局pipe理器的不同特性的快速示例。 你可以玩它。 请注意,主JFrame正在使用默认的BorderLayout 。 我只明确地将布局设置为BorderLayout以便您可以看到哪个布局导致效果。

还可以看看使用容器布置组件,以了解有关如何使用不同布局pipe理器的更多信息。 避免使用空的布局,并试图自己放置一切。 让布局为你做,因为Swing是用来与布局pipe理器一起使用的。


在这里输入图像描述

 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class TestLayoutManagers { private JPanel northFlowLayoutPanel; private JPanel southBorderLayoutPanel; private JPanel centerGridBagLayoutPanel; private JPanel westBoxLayoutPanel; private JPanel eastGridLayoutPanel; private final JButton northButton = new JButton("North Button"); private final JButton southButton = new JButton("South Button"); private final JButton centerButton = new JButton("Center Button"); private final JButton eastButton = new JButton("East Button"); private final JButton westButton = new JButton("West Button"); public TestLayoutManagers() { northFlowLayoutPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); southBorderLayoutPanel = new JPanel(new BorderLayout()); centerGridBagLayoutPanel = new JPanel(new GridBagLayout()); eastGridLayoutPanel = new JPanel(new GridLayout(1, 1)); Box box = Box.createHorizontalBox(); westBoxLayoutPanel = new JPanel(); northFlowLayoutPanel.add(northButton); northFlowLayoutPanel.setBorder(BorderFactory.createTitledBorder("Flow Layout")); southBorderLayoutPanel.add(southButton); southBorderLayoutPanel.setBorder(BorderFactory.createTitledBorder("Border Layout")); centerGridBagLayoutPanel.add(centerButton); centerGridBagLayoutPanel.setBorder(BorderFactory.createTitledBorder("GridBag Layout")); eastGridLayoutPanel.add(eastButton); eastGridLayoutPanel.setBorder(BorderFactory.createTitledBorder("Grid Layout")); box.add(westButton); westBoxLayoutPanel.add(box); westBoxLayoutPanel.setBorder(BorderFactory.createTitledBorder("Box Layout")); JFrame frame = new JFrame("Test Layout Managers"); frame.setLayout(new BorderLayout()); // This is the deafault layout frame.add(northFlowLayoutPanel, BorderLayout.PAGE_START); frame.add(southBorderLayoutPanel, BorderLayout.PAGE_END); frame.add(centerGridBagLayoutPanel, BorderLayout.CENTER); frame.add(eastGridLayoutPanel, BorderLayout.LINE_END); frame.add(westBoxLayoutPanel, BorderLayout.LINE_START); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { TestLayoutManagers testLayoutManagers = new TestLayoutManagers(); } }); } }