swing JPanel绘制方法正在响应,但期望paintComponents在设置背景图像时响应

swing JPanel绘制方法正在响应,但期望paintComponents在设置背景图像时响应,swing,jpanel,Swing,Jpanel,我正在用这个在JPanel中设置背景图像 JPanel panel = new JPanel(){ @Override public void paint(Graphics g) { super.paint(g); g.drawImage(ImageHelper.createResizedCopy(image, height, width, false), 0, 0, null);

我正在用这个在JPanel中设置背景图像

JPanel panel = new JPanel(){
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.drawImage(ImageHelper.createResizedCopy(image, height, width, false), 0, 0, null);
            }

        };


        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setPreferredSize(new Dimension(height, width));
        panel.setOpaque(false);
        panel.add(new JLabel("SCIENCE FAIR"));
        panel.setBorder(new RoundedBorder(1,2,new Color(100, 200, 112)));

        return panel;
我希望paintComponents方法能够响应,但不知何故paintComponents没有响应,但paint正在完成在JPanel中绘制背景图像的工作。 这个JPanel是另一个JPanel的孩子。 父JPanel使用MigLayout,在父JPanel中,我添加了4个不同的JPanel,它们具有不同的背景图像


背景图像已完成,但在背景图像之上,我无法添加JLabel,因此我怀疑绘制方法是否是问题所在

在绘制孩子们之后,您正在绘制整个组件--换句话说,您正在绘制孩子们的正上方。切勿覆盖Swing组件中的
paint()
;替换为重写
paintComponent()
,并确保在绘制背景图像后调用
super.paintComponent()

在绘制孩子们之后,您正在绘制整个组件——换句话说,您正在绘制孩子们的正上方。切勿覆盖Swing组件中的
paint()
;替换为重写
paintComponent()
,并确保在绘制背景图像后调用
super.paintComponent()

还可以更改以下内容:

g.drawImage(ImageHelper.createResizedCopy(image, height, width, false), 0, 0, null);
为此:

g.drawImage(ImageHelper.createResizedCopy(image, height, width, false), 0, 0, this);
JPanel
是一个
ImageObserver
,因此您可以将其与<代码>图像观察者

也更改此项:

g.drawImage(ImageHelper.createResizedCopy(image, height, width, false), 0, 0, null);
为此:

g.drawImage(ImageHelper.createResizedCopy(image, height, width, false), 0, 0, this);

JPanel
是一个
ImageObserver
,因此您可以将其与
ImageObserver

感谢您的评论,但在调用此面板时,我有一个线程操作,如果我传递“this”,我的UI线程操作将受到影响。所以我avoided@AbhishekChoudhary:如果是,请验证的正确使用。感谢您的评论,但在调用此面板时,我有一个线程操作,如果我传递“this”,我的UI线程操作将受到影响。所以我avoided@AbhishekChoudhary:如果是,请验证是否正确使用了。