将 JPanel 添加到主面板
Adding JPanels to a main Panel
所以我创建了三个 classes,主要方法 class、Frame class 和 JPanel class。在 JPanel 内部 class 我想再添加三个 JPanel,一个在 JFrame 的顶部,一个在中间,一个在底部。我的 classes JPanel 和 JFrame 代码如下:
J面板:
public class ConcertPanel extends JPanel
{
public ConcertPanel()
{
JPanel ConcertPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel Panel1 = new JPanel();
Panel1.setSize(800,200);
Panel1.setBackground(Color.BLUE);
JPanel Panel2 = new JPanel();
Panel2.setSize(800,400);
Panel1.setBackground(Color.GREEN);
JPanel Panel3 = new JPanel();
Panel3.setSize(800,200);
Panel1.setBackground(Color.GRAY);
this.add(Panel1);
this.add(Panel2);
this.add(Panel3);
}
}
public class ConcertFrame extends JFrame
{
private ConcertPanel controlPane;
// The constructor
public ConcertFrame()
{
controlPane = new ConcertPanel() ;
this.add(controlPane);
....
当这个项目是 运行 时,没有出现任何错误,但是当弹出 JFrame 时,它没有给我其中的三个不同颜色的面板,只有顶部的一个小灰色框.谁能告诉我原因或帮助?
一个主要问题是代码没有考虑 preferredSize
和布局管理器。
所有颜色 JPanel 的首选大小是 0,0,设置 大小 不会影响这一点。由于它们被添加到默认布局管理器为 FlowLayout 的 JPanel,因此布局不会增加它们的大小。因此,由于大多数布局管理器都尊重首选大小而不是实际大小,并且 FlowLayout 不会改变这一点,因此添加了 JPanels ,但从未见过。
而是考虑对主容器使用其他布局,例如,如果所有组件都具有相同的大小,则使用 GridLayout,或者如果所有组件都放置在一行或一列中,则使用 BoxLayout。也考虑重写 getPreferredSize
方法,但要谨慎且仅在需要时才重写。
一个 "cheat" 解决方案是将 setSize(...)
更改为 setPreferredSize(new Dimensnion(...))
,但这是不受欢迎的。
例如:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColorPanels extends JPanel {
public ColorPanels() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(new ColorPanel(Color.BLUE, 800, 200));
add(new ColorPanel(Color.GREEN, 800, 400));
add(new ColorPanel(Color.GRAY, 800, 200));
}
private static class ColorPanel extends JPanel {
private int w;
private int h;
public ColorPanel(Color color, int w, int h) {
this.w = w;
this.h = h;
setBackground(color);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(w, h);
}
}
private static void createAndShowGui() {
ColorPanels mainPanel = new ColorPanels();
JFrame frame = new JFrame("ColorPanels");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
所以我创建了三个 classes,主要方法 class、Frame class 和 JPanel class。在 JPanel 内部 class 我想再添加三个 JPanel,一个在 JFrame 的顶部,一个在中间,一个在底部。我的 classes JPanel 和 JFrame 代码如下: J面板:
public class ConcertPanel extends JPanel
{
public ConcertPanel()
{
JPanel ConcertPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel Panel1 = new JPanel();
Panel1.setSize(800,200);
Panel1.setBackground(Color.BLUE);
JPanel Panel2 = new JPanel();
Panel2.setSize(800,400);
Panel1.setBackground(Color.GREEN);
JPanel Panel3 = new JPanel();
Panel3.setSize(800,200);
Panel1.setBackground(Color.GRAY);
this.add(Panel1);
this.add(Panel2);
this.add(Panel3);
}
}
public class ConcertFrame extends JFrame
{
private ConcertPanel controlPane;
// The constructor
public ConcertFrame()
{
controlPane = new ConcertPanel() ;
this.add(controlPane);
....
当这个项目是 运行 时,没有出现任何错误,但是当弹出 JFrame 时,它没有给我其中的三个不同颜色的面板,只有顶部的一个小灰色框.谁能告诉我原因或帮助?
一个主要问题是代码没有考虑 preferredSize
和布局管理器。
所有颜色 JPanel 的首选大小是 0,0,设置 大小 不会影响这一点。由于它们被添加到默认布局管理器为 FlowLayout 的 JPanel,因此布局不会增加它们的大小。因此,由于大多数布局管理器都尊重首选大小而不是实际大小,并且 FlowLayout 不会改变这一点,因此添加了 JPanels ,但从未见过。
而是考虑对主容器使用其他布局,例如,如果所有组件都具有相同的大小,则使用 GridLayout,或者如果所有组件都放置在一行或一列中,则使用 BoxLayout。也考虑重写 getPreferredSize
方法,但要谨慎且仅在需要时才重写。
一个 "cheat" 解决方案是将 setSize(...)
更改为 setPreferredSize(new Dimensnion(...))
,但这是不受欢迎的。
例如:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColorPanels extends JPanel {
public ColorPanels() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(new ColorPanel(Color.BLUE, 800, 200));
add(new ColorPanel(Color.GREEN, 800, 400));
add(new ColorPanel(Color.GRAY, 800, 200));
}
private static class ColorPanel extends JPanel {
private int w;
private int h;
public ColorPanel(Color color, int w, int h) {
this.w = w;
this.h = h;
setBackground(color);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(w, h);
}
}
private static void createAndShowGui() {
ColorPanels mainPanel = new ColorPanels();
JFrame frame = new JFrame("ColorPanels");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}