gpt4 book ai didi

java - 无法让 JPanel 在 Swing 中正确调整大小

转载 作者:搜寻专家 更新时间:2023-11-01 01:17:58 25 4
gpt4 key购买 nike

我刚刚开始学习 Swing,并为自己构建了一个示例 GUI 作为练习。非常基本,它在 JFrame 的西侧、中侧和东侧具有三个面板。在最后一个面板中,还有另一个面板和一个按钮。面板是我对JPanel的扩展,DrawPanel。每次单击其下方的按钮 Repaint 时,它都会随机绘制一个 Rectangle。这是我的代码:

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

如果我将东面板设置为使用 BorderLayoutBoxLayout 布局,这将使 DrawPanel 显示更大。

  1. 但我不明白为什么设置 DrawPanel 对象的大小实际上并没有改变它的大小,以及为什么无论我执行 setSize(50,50);
  2. 如何让中间面板停止调整得如此之大,以便东面板可以调整得更宽?或者如何调整 East 面板的大小?

最佳答案

BorderLayout 遵循其 west 和 east 组件的首选宽度。并且它尊重其中心组件的首选宽度和高度。因此,您的 DrawPanel 应该覆盖 getPreferredSize() 并返回适当的首选大小。

由于它位于 BorderLayout 的中心,BorderLayout 也有一个南组件,因此东面板的首选宽度将是绘图面板和按钮的首选宽度的最大值。

关于java - 无法让 JPanel 在 Swing 中正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com