简体   繁体   English

无法在Swing中正确调整JPanel的大小

[英]Can't get JPanel to size properly in Swing

I'm just learning Swing, and built a sample GUI for myself as practice. 我只是学习Swing,并为自己构建了一个示例GUI作为练习。 Very basic, it has three panels on the West, Center, and East sides of the JFrame . 非常基本的,它在JFrame的西侧, JFrame和东侧有三个面板。 In the last panel, there is another panel and a button. 在最后一个面板中,有另一个面板和一个按钮。 The panel is my extension of JPanel , DrawPanel . 该面板是我的JPanelDrawPanel扩展。 It draws a random Rectangle every time the button beneath it Repaint is clicked. 每次单击Repaint下方的按钮时,它会绘制一个随机的Rectangle This is my code: 这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Tester
{
    public static DrawPanel panelEastDrawPanelCenter;

    public static void main()
    {
        Tester gui = new Tester();
        gui.go();
    }
    public void go()
    {
        JFrame frame = new JFrame("This is the title");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create all the Western Panel components
        JPanel panelWest = new JPanel();
        //    panelWest.setLayout(new BorderLayout());
        JButton panelWestButtonWest = new JButton("Western-most West Button");
        JButton panelWestButtonCenter = new JButton("Western-most Center Button");
        JButton panelWestButtonEast = new JButton("Western-most East Button");

        // Create all Center Panel components
        JPanel panelCenter = new JPanel();
            panelCenter.setBackground(Color.darkGray);
        JButton panelCenterButtonCenter = new JButton("Center Button");

        // Create all East Panel components
        JPanel panelEast = new JPanel();
        panelEastDrawPanelCenter = new DrawPanel();
            panelEastDrawPanelCenter.setSize(50,50);
        JButton panelEastButtonSouth = new JButton("Repaint");
            panelEastButtonSouth.addActionListener(new panelEastButtonSouthListener());

        // Add everything to the GUI
        // West Panel
        frame.getContentPane().add(BorderLayout.WEST, panelWest);
        panelWest.add(BorderLayout.WEST, panelWestButtonWest);
        panelWest.add(BorderLayout.CENTER, panelWestButtonCenter);     
        panelWest.add(BorderLayout.EAST, panelWestButtonEast);

        // Center Panel
        frame.getContentPane().add(BorderLayout.CENTER, panelCenter);
        panelCenter.add(BorderLayout.CENTER, panelCenterButtonCenter);

        // East Panel
        frame.getContentPane().add(BorderLayout.EAST, panelEast);
        panelEast.add(panelEastDrawPanelCenter);
        panelEast.add(panelEastButtonSouth);

        frame.pack();
        //frame.setSize(frame.getWidth(), 500);
        frame.setVisible(true);
    }
    class panelEastButtonSouthListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            panelEastDrawPanelCenter.repaint();
        }
    }
    class DrawPanel extends JPanel // JPanel that displays a rectangle upon clicking the button "Repaint"
    {
        public void paintComponent(Graphics g)
        {
            g.setColor(Color.WHITE); // Removes previous rectangle
            g.fillRect(0,0, this.getWidth(),this.getHeight());

            g.setColor(randColor()); // Puts a new rectangle on screen, rand size and color
            int height = (int)(Math.random() * this.getHeight());
            int width = (int)(Math.random() * this.getHeight());
            int x = (int)(Math.random() * 20);
            int y = (int)(Math.random() * 20);
            g.fillRect(x,y, height,width);
        }
        public Color randColor()
        {
            int r = (int)(Math.random() * 255);
            int g = (int)(Math.random() * 255);
            int b = (int)(Math.random() * 255);
            return new Color(r, g, b);
        }
    }
}

The problem I am encountering is that although I explicitly setSize() for the DrawPanel object ( panelEastDrawPanelCenter ) to 50×50, when I run the program it ( DrawPanel ) is still a small panel next to the button, and panelEast (the container for DrawPanel and the button) is still the same width (and will never get wider). 我遇到的问题是虽然我将DrawPanel对象( panelEastDrawPanelCenter )的显式setSize()显式panelEastDrawPanelCenter为50×50,但是当我运行程序时它( DrawPanel )仍然是按钮旁边的一个小面板,而panelEast(容器为DrawPanel和按钮)仍然是相同的宽度(并且永远不会变宽)。 I realize that I can say 我意识到我可以说

frame.pack();
frame.setSize(frame.getWidth(), 500);

if I set the east panel to use a layout of either BorderLayout or BoxLayout , and this will make the DrawPanel display bigger. 如果我将东面板设置为使用BorderLayoutBoxLayout的布局,这将使DrawPanel显示更大。

  1. But I do not understand why setting the size of the DrawPanel object does not actually change its size, and why it remains small regardless of me doing setSize(50,50); 但我不明白为什么设置DrawPanel对象的大小实际上并没有改变它的大小,为什么它仍然很小而不管我做setSize(50,50);
  2. How would I get the middle panel to stop resizing so huge, so that the East panel can resize to be wider? 我如何让中间面板停止调整如此巨大,以便东面板可以调整为更宽? Or how do I resize the East panel? 或者我如何调整东面板的大小?

The BorderLayout respects the preferred width of its west and east components. BorderLayout尊重其西部和东部组件的首选宽度。 And it respects the preferred width and height of its center component. 它尊重其中心组件的首选宽度和高度。 So, your DrawPanel should override getPreferredSize() and return the appropriate preferred size. 因此,您的DrawPanel应覆盖getPreferredSize()并返回适当的首选大小。

Since it's placed at the center of a BorderLayout which also has a south component, the preferred width of the east panel will be the max of the preferred width of the draw panel and of the button. 由于它位于BorderLayout的中心,也有一个南部组件,因此东面板的首选宽度将是绘图面板和按钮的首选宽度的最大值。

您是否尝试过使用panel.setPerferredSize(Dimension size);

尝试使用setPreferredSize(Dimension)方法而不是setSize(int, int)然后调用pack()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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