将JPanels添加到CENTER以外的区域



我目前正在阅读Head First Java关于制作GUI的第12章。他们刚刚提到JFrame分为中心、北部、南部、东部和西部。然后,本书使用2参数add()方法将指定的组件添加到具有该JFrame的指定区域中。

我可以为五个区域中的每一个添加一个JButton。我也可以把我自己的JPanel添加到中心区域,周围都是JButton。但当我试图把JPanel加入到中心以外的任何区域时,JPanel都不会出现。

在过去的一个小时里,我真的搜索了整个网络和Stack Overflow,没有发现任何提到在JFrame的中心以外的任何区域添加JPanel的内容。所以我的问题是:是否可以将JPanel添加到JFrame的北部、南部、东部或西部区域?

提前感谢任何能帮助我的人。

以下是我一直试图在北部地区用我的JPanel运行的代码:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.BorderLayout;
public class StackQ {
    JFrame frame;
    public static void main(String [] args) {
        StackQ gui = new StackQ();
        gui.go();
    }
    public void go() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton button = new JButton("location test");
        JButton button2 = new JButton("location test");
        JButton button3 = new JButton("location test");
        JButton button4 = new JButton("location test");
        myDrawPanel custom = new myDrawPanel();
        frame.getContentPane().add(button, BorderLayout.CENTER);
        frame.getContentPane().add(button2, BorderLayout.EAST);
        frame.getContentPane().add(button3, BorderLayout.WEST);
        frame.getContentPane().add(button4, BorderLayout.SOUTH);
        frame.getContentPane().add(custom, BorderLayout.NORTH);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}
class myDrawPanel extends JPanel {
    public void paintComponent(Graphics g) {
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int) (Math.random() * 255);
        Color random = new Color(red, green, blue);
        g.setColor(random);
        g.fillOval(20,20,100,100);
    }
}

这可能更清楚,但在BorderLayout文档中有描述:

组件根据其首选尺寸和容器尺寸的限制进行布局。。。。CCD_ 2分量可以水平地和垂直地拉伸以填充剩余的任何空间。

换句话说,CENTER组件将被拉伸(如果需要的话)以填充应用程序,并且任何其他组件都需要指定一个首选大小,以便从CENTER中获取一些。

默认情况下,JButton根据按钮的内容指定首选大小。另一方面,JPanel没有-它的首选大小取决于它的内容,而您的JPanel没有任何内容,因此其首选大小为零。

简而言之,为JPanel指定一个首选大小,BorderLayout将尝试为面板分配至少那么多空间。

为了获得想要的结果,我首先在StackQ类的顶部导入了Dimension类(这是必需的,因为稍后在go()方法中使用的setPreferredSize()方法接受Dimension类型的参数):

import java.awt.Dimension;

然后,在myDrawPanel类实例化后,我立即将此代码添加到go()方法中:

Dimension dims = new Dimension(1366, 200);
custom.setPreferredSize(dims);

我选择1366作为宽度,因为这就是我的屏幕有多大

感谢大家的帮助!

相关内容

  • 没有找到相关文章

最新更新