Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JPanel添加到JLayeredPane会导致无法调用paint()方法_Java_Jframe_Jpanel_Paint_Repaint - Fatal编程技术网

Java 将JPanel添加到JLayeredPane会导致无法调用paint()方法

Java 将JPanel添加到JLayeredPane会导致无法调用paint()方法,java,jframe,jpanel,paint,repaint,Java,Jframe,Jpanel,Paint,Repaint,为了提供一些可能有用的背景信息,我正在创建游戏pong,我决定添加一个escape/pause菜单(当你按下键盘上的escape时,会弹出一个带有一些设置的菜单),我环顾四周,发现最好的方法是使用JLayeredPane并在顶部添加另一个JPanel。然而,当我将“painter”类添加到JLayeredPane时,paint(Graphics g)方法停止了调用(当我将其添加到JFrame时,它工作得很好) 这是我的绘画课 import java.awt.*; import javax.swi

为了提供一些可能有用的背景信息,我正在创建游戏pong,我决定添加一个escape/pause菜单(当你按下键盘上的escape时,会弹出一个带有一些设置的菜单),我环顾四周,发现最好的方法是使用JLayeredPane并在顶部添加另一个JPanel。然而,当我将“painter”类添加到JLayeredPane时,paint(Graphics g)方法停止了调用(当我将其添加到JFrame时,它工作得很好)

这是我的绘画课

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)
在这种情况下,从未调用绘制方法。通过执行添加(lp)我得到了一个IllegalArgumentException,用于将容器的父级添加到自身。

以下是使用LayeredPane的mcve:

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

您应该
添加(lp)
。更多帮助帖子。我建议阅读抱歉,这是我在这里的第一篇帖子。我确实尝试了
add(lp)
,但没有成功,错误消息是“将容器的父容器添加到自身”。我会开始读的,谢谢。不过,如果你能想出什么办法,请告诉我@C0DER请用您所做的更改更新发布的代码。将
JLayeredPane
添加到
JFrame
不应导致此错误。“如果你能找出任何问题”-我可以试试,在你发布@c0der之后,这是我在复制问题时能得到的最小值,任何更少的东西,代码都不会完整。忽略我的评论。我指的是
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);
    }
}