[英]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
. 该面板是我的
JPanel
, DrawPanel
扩展。 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. 如果我将东面板设置为使用
BorderLayout
或BoxLayout
的布局,这将使DrawPanel
显示更大。
DrawPanel
object does not actually change its size, and why it remains small regardless of me doing setSize(50,50);
DrawPanel
对象的大小实际上并没有改变它的大小,为什么它仍然很小而不管我做setSize(50,50);
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.