JPanel填充整个JFrame

时间:2015-07-18 10:36:04

标签: java swing jframe jpanel border-layout

我想在JFrame中放置一个300,200尺寸的JPanel,位于100,50位置,但是下面的代码使整个JFrame充满了JPanel,我错了吗? 代码:

public class Class1  {

    public static void main(String[] args) {

         JFrame frame = new JFrame();
         JPanel panel = new JPanel();

         frame.setSize(700, 500);              
         panel.setSize(300, 200);
         panel.setBackground(Color.green);
         panel.setCursor(new Cursor(java.awt.Cursor.HAND_CURSOR));

         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

         frame.add(panel, BorderLayout.CENTER);         

         frame.setVisible(true);
         frame.setLocationRelativeTo(null);
    }


}

如果我更改BorderLayout.SOUTH或NORTH,则JPanel看起来像JFrame底部或顶部的细线。我也尝试使用首选尺寸,但结果仍然相同。

3 个答案:

答案 0 :(得分:4)

在使用Swing尝试任何操作之前,您需要了解布局管理器的基础知识。

在这里学习教程https://docs.oracle.com/javase/tutorial/uiswing/layout/howLayoutWorks.html

如果您尝试使用各种Swing控件构建表单,请不要使用绝对坐标来定位它们。调整窗口大小应根据您要使用的布局类型动态重新定位控件。如果您使用面板作为绘图画布(我认为您正在使用它),请查看下面的示例。

首先尝试掌握几个基本布局,例如BorderLayout和GridLayout。一旦掌握,你可以使用很少的东西来实现你想要的任何类型的布局,将它们嵌套在一起。还要学习ScrollPane的基础知识,以有效利用屏幕空间

至于您的原始问题,我创建了一个示例,说明BorderLayout的工作原理以及如何绘制到面板上的特定区域。我还添加了一些代码,因此您可以根据您是否位于给定面板中较小的区域来设置不同的光标。

试试这个:

using

enter image description here

答案 1 :(得分:1)

如果您希望面板占用JFrame(contentpane)的一部分,您可以使用其他布局管理器。他是使用GroupLayout的一个例子:

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Class1  {

    public static void main(String[] args) {

         JFrame frame = new JFrame();
         JPanel panel = new JPanel();

         frame.getContentPane().setPreferredSize(new Dimension(700, 500) );
         panel.setPreferredSize(new Dimension(300, 200));
         panel.setBackground(Color.green);
         panel.setCursor(new Cursor(java.awt.Cursor.HAND_CURSOR));

         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
         groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGap(104)
                    .addComponent(panel, GroupLayout.PREFERRED_SIZE, 493, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(103, Short.MAX_VALUE))
         );
         groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGap(100)
                    .addComponent(panel, GroupLayout.PREFERRED_SIZE, 301, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(99, Short.MAX_VALUE))
         );
         frame.getContentPane().setLayout(groupLayout);
         frame.pack();
         frame.setVisible(true);
         frame.setLocationRelativeTo(null);
    }


}

输出: enter image description here

使用BorderLayout的另一个例子是另外4个"占位符"或触角板:

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;

public class Class1  {

    public static void main(String[] args) {

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout(0, 0));

        JPanel centerPanel = new JPanel();
        centerPanel.setPreferredSize(new Dimension(300, 200));
        centerPanel.setBackground(Color.green);
        centerPanel.setCursor(new Cursor(java.awt.Cursor.HAND_CURSOR));
        frame.getContentPane().add(centerPanel);

        JPanel northPanel = new JPanel();
        northPanel.setBackground(Color.RED);
        northPanel.setForeground(Color.BLACK);
        northPanel.setPreferredSize(new Dimension(0, 150));
        frame.getContentPane().add(northPanel, BorderLayout.NORTH);

        JPanel westPanel = new JPanel();
        westPanel.setBackground(Color.MAGENTA);
        westPanel.setPreferredSize(new Dimension(200, 0));
        frame.getContentPane().add(westPanel, BorderLayout.WEST);

        JPanel southPanel = new JPanel();
        southPanel.setBackground(Color.YELLOW);
        southPanel.setPreferredSize(new Dimension(0, 150));
        frame.getContentPane().add(southPanel, BorderLayout.SOUTH);

        JPanel eastPanel = new JPanel();
        eastPanel.setBackground(Color.BLUE);
        eastPanel.setPreferredSize(new Dimension(200, 0));
        frame.getContentPane().add(eastPanel, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }


}

输出: enter image description here

答案 2 :(得分:1)

import javax.swing.*;
import java.awt.*;
public class Class1  {

    public static void main(String[] args) {

         JFrame frame = new JFrame();
         JPanel panel = new JPanel();
         JPanel another = new JPanel();
         JPanel emptyPanel = new JPanel();
         emptyPanel.setPreferredSize(new Dimension(700, 50));
         frame.setSize(700, 500); 


         panel.setMaximumSize(new Dimension(300, 200));
         panel.setMinimumSize(new Dimension(300, 200));
         panel.setPreferredSize(new Dimension(300, 200));
         panel.setBackground(Color.green);
         panel.setCursor(new Cursor(java.awt.Cursor.HAND_CURSOR));

         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

         another.add(emptyPanel, BorderLayout.NORTH);
         another.add(panel, BorderLayout.CENTER);         

         frame.add(another);
         frame.setVisible(true);
         frame.setLocationRelativeTo(null);
    }


}

创建的图片类似于enter image description here

在我看来,JFrame的直接子容器的大小调整为JFrame(顶级容器)本身的大小。