Почему не показывает рисование 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);
}
}
}