【问题标题】:Adding JPanel to JLayeredPane causes paint() method to not get called将 JPanel 添加到 JLayeredPane 会导致不调用paint() 方法
【发布时间】:2018-06-24 16:50:49
【问题描述】:

为了提供一些可能有帮助的背景信息,我正在创建游戏乒乓球,我决定添加一个转义/暂停菜单(当你在键盘上按下转义键时,会弹出一个包含一些设置的菜单),我环顾四周发现最好的方法是使用 JLayeredPane 并在顶部添加另一个 JPanel。但是,当我将“painter”类添加到 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();
    }

}

这是我的 Painter 课程

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

public class Painter extends JPanel {

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

}

我最初尝试使用lp.add(painter); 而不是add(lp);,在这种情况下,paint 方法永远不会被调用。通过执行 add(lp) 我得到一个 IllegalArgumentException 用于将容器的父级添加到自身。

【问题讨论】:

  • 你应该add(lp)。如需更多帮助,请发帖minimal reproducible example。我建议阅读Performing Custom Painting
  • 对不起,这是我在这里的第一篇文章。我确实尝试过add(lp),但它不起作用,错误消息是“将容器的父级添加到自身”。我将开始阅读,谢谢。但是,如果您能够弄清楚任何事情,请告诉我! @c0der
  • 请使用您所做的更改更新发布的代码。将JLayeredPane 添加到JFrame 不应导致此错误。 “如果你能解决任何问题” - 我可以试试,在你发帖 minimal reproducible example
  • @c0der 这是我在复制问题的同时能得到的最低限度,再少一点,代码就不会完整
  • 对不起。忽略我的评论。我指的是CardLayout

标签: java jframe jpanel paint repaint


【解决方案1】:

这是使用 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);
    }
}

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2017-11-02
    相关资源
    最近更新 更多