Добавление JPanel в JLayeredPane приводит к тому, что метод paint () не вызывается - PullRequest
0 голосов
/ 24 июня 2018

Чтобы получить некоторую справочную информацию, которая может помочь, я создаю понг игры и решил добавить меню escape / pause (когда вы нажимаете escape на клавиатуре, появляется меню с некоторыми настройками), я огляделся и нашел что лучший способ сделать это - использовать JLayeredPane и добавить еще одну JPanel сверху. Однако, когда я добавил свой класс «живописец» в JLayeredPane, метод paint (Graphics g) перестал вызываться (он работал нормально, когда я только добавил его в JFrame).

import javax.swing.*;

public class Game extends JFrame {

    public static Painter painter;

    public Game() {
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLayeredPane lp = getLayeredPane();

        painter = new Painter();

        add(lp);
    }

    public static void main(String[] args) {
        Game frame = new Game();
        frame.setVisible(true);
        painter.repaint();
    }

}

А вот и мой класс Художника

import java.awt.*;
import javax.swing.*;

public class Painter extends JPanel {

    public void paint(Graphics g) {
        System.out.println("Working");
        super.paint(g);
    }

}

Вместо add(lp); я первоначально попытался lp.add(painter);, и в этом случае метод рисования никогда не вызывался. Делая add(lp), я получаю исключение IllegalArgumentException для добавления родительского элемента контейнера к себе.

1 Ответ

0 голосов
/ 26 июня 2018

Вот пример использования LayeredPane:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Game extends JFrame {

    public Game() {
        setSize(250, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLayeredPane lp = getLayeredPane();
        //assign layout manager. otherwise you need to set content
        //bounds (not recommended)
        lp.setLayout(new BorderLayout());
        Painter painter = new Painter();
        lp.add(painter,1);
    }

    public static void main(String[] args) {
        Game frame = new Game();
        frame.setVisible(true);;
    }
}

class Painter extends JPanel {

    @Override
    protected void paintComponent(Graphics g) { //do not override paint
        super.paintComponent(g);
        g.drawString("Working",50,50);
    }
}
...