gpt4 book ai didi

java - 为什么 paintComponent 从未被调用?

转载 作者:太空狗 更新时间:2023-10-29 11:05:11 30 4
gpt4 key购买 nike

我有以下代码。基本上我有一个有背景图像的框架。我在框架内也有三个面板:面板 1、2 和 3。2 和 3 工作正常,因为我没有对它们进行子分类。但是,一旦我将面板 1 子类化,即将逻辑放入 JPanel 的 paintComponent 方法中,它就会停止工作,因为该方法从未被调用并且 foo 也从未被打印过。我不知道为什么。感谢您的帮助。我尝试了其他类似主题的一些建议,但没有帮助。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

public static void main(String[] args) throws IOException {

JFrame.setDefaultLookAndFeelDecorated(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

int fooPanelX = 5;
int fooPanelY = 160;
int fooPanelWidth = 470;
int fooPanelHeight = 305;

int bar0PanelX = 5;
int bar0PanelY = 550;
int bar0PanelWidth = 230;
int bar0PanelHeight = 210;

int bar1PanelX = bar0PanelX * 2 + bar0PanelWidth + bar0PanelX;
int bar1PanelY = bar0PanelY;
int bar1PanelWidth = bar0PanelWidth;
int bar1PanelHeight = bar0PanelHeight;

JPanel panel1 = new Panel1(fooPanelX, fooPanelY, fooPanelWidth, fooPanelHeight);

JPanel panel2 = new JPanel();
panel2.setBackground(Color.WHITE);
panel2.setLocation(bar0PanelX, bar0PanelY);
panel2.setSize(bar0PanelWidth, bar0PanelHeight);
panel2.setOpaque(false);
panel2.setBorder(BorderFactory.createLineBorder(Color.WHITE));
panel2.setBounds(bar0PanelX, bar0PanelY, bar0PanelWidth, bar0PanelHeight);

JPanel panel3 = new JPanel();
panel3.setBackground(Color.WHITE);
panel3.setLocation(bar1PanelX, bar1PanelX);
panel3.setSize(bar1PanelWidth, bar1PanelHeight);
panel3.setOpaque(false);
panel3.setBorder(BorderFactory.createLineBorder(Color.WHITE));
panel3.setBounds(bar1PanelX, bar1PanelY, bar1PanelWidth, bar1PanelHeight);

JLabel imagePanel = new JLabel(new ImageIcon(ImageIO.read(new File("image.png"))));

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 27) {
System.exit(0);
}
}

});

frame.setContentPane(imagePanel);
frame.getContentPane().add(panel1);
frame.getContentPane().add(panel2);
frame.getContentPane().add(panel3);
frame.setLocation((int) (screenSize.getWidth() * 0.75),
(int) (screenSize.getHeight() * 0.25));
frame.pack();
frame.setVisible(true);

}

@SuppressWarnings("serial")
static class Panel1 extends JPanel {

int x, y, w, h;

public Panel1(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}

@Override
public void paintComponent(Graphics graphics) {

System.out.println("foo");
super.paintComponents(graphics);

setBackground(Color.WHITE);
setLocation(x, y);
setSize(w, h);
setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.WHITE));

}

}

}

更新:如果您无法找到问题所在,请提供一种替代方法来执行以下操作。我需要一个带有背景图像的框架和背景图像顶部的三个面板。这三个面板必须在背景图像上具有像素完美的位置和大小才能看起来正确。差不多就是这样。我将重新绘制三个面板,但背景图像将保持不变。

最佳答案

嗯,问题是您没有使用合适的 LayoutManager

JLabel 默认不附带任何 LayoutManager。因此,当您添加 Panel1 时,它的大小为 0x0 并且位于 (0,0) 中,并且由于 LayoutManager 不会更改它,因此它将保持该大小和位置。对于空边界,您的组件永远不会被绘制,因此您的 paintComponent 方法永远不会被调用。

现在,你永远不应该在 paintComponent 中这样做:

        setBackground(Color.WHITE);
setLocation(x, y);
setSize(w, h);
setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.WHITE));

在构造函数或其他方法中执行此操作。 paintComponent 用于“绘制组件”,而不是更改其属性。

关于java - 为什么 paintComponent 从未被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609450/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com