JFrame не показывает более одной панели

Я пытаюсь создать простую панель выбора цвета в 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 ответа

Вы должны упаковать свой кадр.

//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();
    }
}

В конце конструктора FrameObject, вам нужно добавить следующую строку.

this.pack(); 

Метод pack устанавливает размер кадра так, чтобы все его содержимое было на уровне или выше их предпочтительных размеров.

Принимать 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);
}

Swing ленив, когда дело доходит до обновления пользовательского интерфейса, он позволяет добавлять и удалять ряд компонентов в "пакетах", не обновляя пользовательский интерфейс или не выполняя новый этап макета, который может быть дорогостоящим.

Если вам нужно динамически обновить пользовательский интерфейс, не забудьте позвонить revalidate с последующим repaint когда вы хотите обновить пользовательский интерфейс

Также предпочитаю pack над setSize как pack будет учитывать декорации кадров и различия в показателях шрифта и других вещах, которые могут изменяться между платформами и системами

Другие вопросы по тегам