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

时间:2014-01-27 07:33:18

标签: java swing layout-manager

程序根据屏幕分辨率或计算机大小运行。当我在具有特定大小的监视器的计算机中运行它时,它将相应地改变。我的问题是JPanel的定位和大小,或框架内的任何对象,采用更改屏幕大小。

因此,每当我在任何不同尺寸的显示器上展示我的程序时,组件仍将按照我最初设计的方式进行组织和放置。但是我在这里用一个名为displayMenu的JPanel测试它。其中显示一个绿色的面板。

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

}

}

此外,看起来我的背景并没有在整个画面中完全传播。顶部有一条白线,其余部分是背景。我该怎么办?谢谢你的帮助!

1 个答案:

答案 0 :(得分:9)

跟进@MadProgrammer评论:

您真的需要学习如何使用布局管理器。设置尺寸不是可行的方法,因为它们在不同的机器上执行不同。

了解布局管理器的一个重要事项是哪些布局遵循其内部组件的首选大小。那些不尊重尺寸的产品会拉伸部件。某些布局可能无法拉伸其组件,但会在主容器拉伸时将它们放置在开放空间内的默认位置。

为了获得理想的结果,有时还需要嵌套具有不同布局的容器,这样可以利用两个或更多布局。

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

下面我简单介绍了一些主要布局管理器的不同性质。你可以玩它。请注意,主JFrame使用的是默认BorderLayout。我只是将布局明确设置为BorderLayout,以便您可以看到哪种布局会产生效果。

另请查看Laying out Components Withing a Container,详细了解如何使用不同的布局管理器。避免使用null布局并尝试自己定位所有内容。让布局为您完成,因为Swing是为与布局管理器一起使用而构建的。


enter image description here

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.*;

public class TestingLayoutManagers {

    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 menuButton1 = new JButton("Menu Item 1");
    private final JButton menuButton2 = new JButton("Menu Item 2");
    private final JButton menuButton3 = new JButton("Menu Item 3");
    private final JButton menuButton4 = new JButton("Menu Item 4");
    private final JButton menuButton5 = new JButton("Menu Item 5");

    public TestingLayoutManagers() {
        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.createVerticalBox();
        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(menuButton1);
        box.add(menuButton2);
        box.add(menuButton3);
        box.add(menuButton4);
        box.add(menuButton5);
        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(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            try {
                UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException
                    | InstantiationException
                    | IllegalAccessException
                    | UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }

            new TestingLayoutManagers();
        });
    }
}