将jpanels添加到主面板中



因此,我创建了三个类,即主方法类,帧类和JPANEL类。在Jpanel类内部,我想添加另外三个Jpanels,一个在Jframe的顶部,一个在中间,一个在底部。我的jpanel和jframe课程的代码如下:jpanel:

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或布局经理。

所有颜色Jpanels的首选尺寸为0,0,设置 size 不会影响这一点。由于他们被添加到jpanel的默认布局管理器是Flowlayout,因此布局不会增加其尺寸。因此,由于大多数所有布局经理都尊重优选的大小而不是实际的大小,并且Flowlayout不会改变这一点,因此添加了JPanels ,但从未见过。

相反,如果所有组件的大小相同,则考虑使用其他组件(如果所有组件都将所有组件都放在行或列中)使用相同的大小或boxlayout,请考虑使用其他布局。也考虑覆盖getPreferredSize方法,但仅在需要时仔细。

"作弊"解决方案是将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());
    }
}

相关内容

  • 没有找到相关文章

最新更新