JFrame不会显示多个面板

时间:2017-04-21 10:09:45

标签: java swing jpanel

我正在尝试在java中为更大的项目创建一个简单的颜色选择器面板。我有一个框架,应该包括一个RGB滑块面板和三个文本字段显示其值。我可以毫无问题地添加滑块面板但是当我尝试添加文本字段面板时,整个事情都会混乱,并且没有任何面板显示。我唯一的问题是如何解决这个问题。谢谢。

这是我的代码:

//importing necessary libraries
import java.awt.*;
import javax.swing.*;

//Object extends JFrame
public class FrameObject extends JFrame
{
    //declaring the panels, one for the color sliders and the other for the text fields
    private JPanel color_panel;
    private JPanel textFileds;

    //arrays to hold the J components for further efficiency 
    private JSlider[] RGB = new JSlider[3];
    private JTextField[] RGBFileds = new JTextField[3];

    public FrameObject()
    {
        //Preparing the frame
        super("Color panel");
        setVisible(true);
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //A grid layout to give desired orientation 
        color_panel = new JPanel(new GridLayout(3, 1));
        textFileds = new JPanel(new GridLayout(3, 1));

        //initializing the individual components through a loop in the arrays
        for(int c=0; c<RGB.length; c++)
        {
            RGB[c] = new JSlider(SwingConstants.HORIZONTAL,0,255,100);
            RGBFileds[c] = new JTextField(12);

            //Adding each component to its specific panel
            color_panel.add(RGB[c]);
            textFileds.add(RGBFileds[c]);
        }

        //adding the sub panels to the main panel.
        add(color_panel,BorderLayout.CENTER);
        add(textFileds,BorderLayout.EAST);
    }


}

public class FrameTest 
{
    public static void main(String[] args) 
    {
        FrameObject f = new FrameObject();
    }

}

3 个答案:

答案 0 :(得分:0)

在构造函数FrameObject的末尾,您需要添加以下行。

this.pack(); 

pack方法调整框架的大小,使其所有内容都达到或超过其首选大小。

答案 1 :(得分:0)

你需要打包你的框架。

//importing necessary libraries
import java.awt.*;
import javax.swing.*;

//Object extends JFrame
public class FrameObject extends JFrame
{
    //declaring the panels, one for the color sliders and the other for the text fields
    private JPanel color_panel;
    private JPanel textFileds;

    //arrays to hold the J components for further efficiency 
    private JSlider[] RGB = new JSlider[3];
    private JTextField[] RGBFileds = new JTextField[3];

    public FrameObject()
    {
        //Preparing the frame
        super("Color panel");
        setVisible(true);
        setSize(400, 400);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //A grid layout to give desired orientation 
        color_panel = new JPanel(new GridLayout(3, 1));
        textFileds = new JPanel(new GridLayout(3, 1));

        //initializing the individual components through a loop in the arrays
        for(int c=0; c<RGB.length; c++)
        {
            RGB[c] = new JSlider(SwingConstants.HORIZONTAL,0,255,100);
            RGBFileds[c] = new JTextField(12);

            //Adding each component to its specific panel
            color_panel.add(RGB[c]);
            textFileds.add(RGBFileds[c]);
        }

        //adding the sub panels to the main panel.
        add(color_panel,BorderLayout.CENTER);
        add(textFileds,BorderLayout.EAST);
        pack();
    }

    public static void main(String[] args) 
    {
        FrameObject f = new FrameObject();
    }
}

答案 2 :(得分:0)

在你建立UI

后,取出setVisible(true);并将其作为你调用的最后一件事
public FrameObject() {
    //Preparing the frame
    super("Color panel");
    //setVisible(true);
    //setSize(400, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //...

    //adding the sub panels to the main panel.
    add(color_panel, BorderLayout.CENTER);
    add(textFileds, BorderLayout.EAST);

    pack();
    setVisible(true);
}

在更新UI时,Swing很懒,它允许你在&#34;批次&#34;中添加和删除许多组件。没有更新UI或执行新的布局传递,这可能很昂贵。

如果您需要动态更新用户界面,请务必在需要更新用户界面时调用revalidate后跟repaint

此外,首选pack优先于setSizepack将考虑框架装饰以及字体指标的差异以及平台和系统之间可能发生变化的其他因素