Почему не показывает рисование Jframe

package org.example;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    private static JFrame jFrame = new JFrame();
    private static ImageIcon imageIcon = new ImageIcon("E:\\Project_Java\\Snake\\Snake\\src\\image\\image_background.jpg");
    private static JLabel background = new JLabel(imageIcon);
    private static Font font = new Font("Typesauce", Font.BOLD, 30);


    public static ArrayList<Ellipse2D> Kreise = new ArrayList<Ellipse2D>();

    public static JButton button_start = new JButton("Start");
    public static JButton button_setting = new JButton("Setting");
    public static JButton button_exit = new JButton("Exit");

    public static void main(String[] args) {

        frame();

    }

    public static void frame() {
        background.setLayout(null);

        button_start.setBounds(50, 300, 120, 40);
        button_start.setFont(font);

        button_setting.setBounds(175, 300, 170, 40);
        button_setting.setFont(font);

        button_exit.setBounds(350, 300, 120, 40);
        button_exit.setFont(font);

        background.add(button_start);
        background.add(button_setting);
        background.add(button_exit);

        jFrame.setSize(500, 500);
        jFrame.setResizable(false);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
        background.setLayout(null);
        background.add(button_start);
        jFrame.setContentPane(background);

        button_start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                button_start.setVisible(false);
                button_setting.setVisible(false);
                button_exit.setVisible(false);
                background.setVisible(false);

                SmileyApp smiley = new SmileyApp();
                //JFrame app = new JFrame("Smiley App");
                jFrame.add(smiley, BorderLayout.CENTER);
                //jFrame.setSize(300, 300);
                //jFrame.setLocationRelativeTo(null);
               // jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //jFrame.setVisible(true);

            }
        });
    }

    public static class SmileyApp extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.YELLOW);
            g.fillOval(10, 10, 200, 200);
            // draw Eyes
            g.setColor(Color.BLACK);
            g.fillOval(55, 65, 30, 30);
            g.fillOval(135, 65, 30, 30);
            // draw Mouth
            g.fillOval(50, 110, 120, 60);
            // adding smile
            g.setColor(Color.YELLOW);
            g.fillRect(50, 110, 120, 30);
            g.fillOval(50, 120, 120, 40);
        }
    } 
}

Ответы (1 шт):

Автор решения: Cof. Cof.

Пояснения

В указанном в вопросе листинге при запуске программы компонент background с дочерними кнопками может не отображаться, если не задать ему размер с помощью методов setSize или setBounds. Аналогичная проблема характерна и для Вашего компонента smiley. В моей версии я решил в качестве корневого компонента окна использовать не background, а объект типа JLayeredPane.

Исправленный пример

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;

public class SwingRuSO {
    private static ImageIcon imageIcon = new ImageIcon("E:\\Project_Java\\Snake\\Snake\\src\\image\\image_background.jpg");
    private static JLabel background = new JLabel(imageIcon);
    private static Font font = new Font("Typesauce", Font.BOLD, 30);


    public static ArrayList<Ellipse2D> Kreise = new ArrayList<Ellipse2D>();

    public static JButton button_start = new JButton("Start");
    public static JButton button_setting = new JButton("Setting");
    public static JButton button_exit = new JButton("Exit");

    public static void main(String[] args) {
        frame();

    }

    public static void frame() {
        background.setBounds(0, 0, 500, 500);
        
        button_start.setBounds(50, 300, 120, 40);
        button_start.setFont(font);
        
        button_setting.setBounds(175, 300, 170, 40);
        button_setting.setFont(font);

        button_exit.setBounds(350, 300, 120, 40);
        button_exit.setFont(font);
        
        JLayeredPane layers = new JLayeredPane();
        layers.add(button_start);
        layers.add(button_setting);
        layers.add(button_exit);
        layers.add(background);
        
        JFrame jFrame = new JFrame();
        jFrame.setSize(500, 500);
        jFrame.setResizable(false);
        jFrame.setBackground(Color.yellow);
        jFrame.setContentPane(layers);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
        
        button_start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                button_start.setVisible(false);
                button_setting.setVisible(false);
                button_exit.setVisible(false);
                background.setVisible(false);

                SmileyApp smiley = new SmileyApp();
                smiley.setSize(250, 250);
                layers.add(smiley, BorderLayout.CENTER);
            }
        });
        
    }

    public static class SmileyApp extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillOval(10, 10, 200, 200);
            // draw Eyes
            g.setColor(Color.BLACK);
            g.fillOval(55, 65, 30, 30);
            g.fillOval(135, 65, 30, 30);
            // draw Mouth
            g.fillOval(50, 110, 120, 60);
            // adding smile
            g.setColor(Color.YELLOW);
            g.fillRect(50, 110, 120, 30);
            g.fillOval(50, 120, 120, 40);
        }
    } 
}
→ Ссылка