Java Can';不要让JPanel在Swing中正确调整大小

Java Can';不要让JPanel在Swing中正确调整大小,java,swing,jpanel,layout-manager,paintcomponent,Java,Swing,Jpanel,Layout Manager,Paintcomponent,我正在学习Swing,并为自己构建了一个示例GUI作为练习。非常基本,它在JFrame的西侧、中间和东侧有三个面板。在最后一个面板中,有另一个面板和一个按钮。该面板是我对JPanel,DrawPanel的扩展。每次单击它下面的按钮“重新绘制”时,它都会绘制一个随机的矩形。这是我的代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Tester { public static

我正在学习Swing,并为自己构建了一个示例GUI作为练习。非常基本,它在
JFrame
的西侧、中间和东侧有三个面板。在最后一个面板中,有另一个面板和一个按钮。该面板是我对
JPanel
DrawPanel
的扩展。每次单击它下面的按钮“重新绘制”时,它都会绘制一个随机的
矩形。这是我的代码:

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);
        }
    }
}
我遇到的问题是,尽管我明确地将
DrawPanel
对象(
panelEastDrawPanelCenter
)的
setSize()
设置为50×50,但当我运行程序时(
DrawPanel
)仍然是按钮旁边的一个小面板,而panelEast(用于
DrawPanel
和按钮的容器)仍然是相同的宽度(并且永远不会变宽)。我意识到我可以说

frame.pack();
frame.setSize(frame.getWidth(), 500);
如果我将东面板设置为使用
BorderLayout
BoxLayout
的布局,这将使
DrawPanel
显示更大

  • 但是我不明白为什么设置
    DrawPanel
    对象的大小实际上并没有改变它的大小,为什么不管我怎么做
    setSize(50,50),它仍然很小
  • 我怎样才能让中间的面板停止调整如此之大的尺寸,使东面板可以调整得更宽?或者如何调整东面板的大小

  • 您是否尝试过使用
    panel.setPerferredSize(维度大小)

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

    边界布局尊重其西部和东部组件的首选宽度。它尊重其中心组件的首选宽度和高度。因此,DrawPanel应该覆盖
    getPreferredSize()
    ,并返回适当的首选大小


    由于它位于边界布局的中心,也有一个南部组件,所以东面板的首选宽度将是绘图面板和按钮的首选宽度的最大值。

    Haha!先生,你是个天才。谢谢。我觉得这样做很有效,但不是最合适的方式。为什么不直接调用
    setPreferredSize(维度d)
    而不是重写
    getPreferredSize()
    ?:-\@Zéychin我在api中找不到该方法(我在
    组件
    下查看),当我尝试在代码中使用它时,它说“
    没有找到适合setPreferredSize(int,int)
    ”的合适方法@Zéychin:因为组件应该知道它的首选大小(基于它包含的其他组件、布局、字体、外观等),而不是从外部强制使用首选大小。每次使用JButton或JLabel时,都不会设置其首选大小,是吗?这是因为JButton或JLabel返回适当的值。@Zéychin,可能不是,