gpt4 book ai didi

java - PaintComponent 从未被调用

转载 作者:行者123 更新时间:2023-12-01 12:16:45 25 4
gpt4 key购买 nike

我已经研究了一天了,我不明白为什么不调用 paintComponent(Graphics g) 方法。我使用第二个构造函数来实例化对象,但仍然没有任何结果。我的室友有一个非常相似的代码并且有效。我做错了什么?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

public class squareImage extends JPanel{

Image picture;
String name;
baharKa outerPanel; // a panel that I add these sqaures in
String topLabel;

int a = 0;
int b = 0;

public squareImage(baharKa out, String top, String name, Image im){ //This is the first constructor
this.outerPanel = out;
this.name = name;
this.picture = im;
this.topLabel = top;
this.setPreferredSize(new Dimension(80, 60));
this.setBounds(a, b, getWidth(), getHeight());
this.setPreferredSize(new Dimension(80,80));
this.setOpaque(false);
}

public squareImage(baharKa out, String top, String name, Image im, int a, int b){ //This is second contructor
this(out, top, name, im);
this.a = a;
this.b = b;
this.setBounds(a, b, getWidth(), getHeight());
out.revalidate();
}

protected void paintComponent(Graphics g) { //This is never called
super.paintComponent(g);
System.out.println ("hi!");
int i = g.getFontMetrics().stringWidth(name);
int j = g.getFontMetrics().stringWidth(topLabel);
g.drawImage(picture, 20, 20, 40, 40, null);
g.setColor(Color.BLACK);
g.setFont(new Font("Calibri", Font.PLAIN, 12));
g.drawString(name, i/2 + 40, 45);
g.drawString(name, j/2 + 40, 15);
}

}

/////////我在这里使用它///////

protected void showMeTheSquares(){
try {
System.out.println("showme");
wood = new squareImage(baharKaPanel, "0", "Wood", ImageIO.read(new File("images/wood.png")), 200, 75);
metal = new squareImage(baharKaPanel, "0", "Metal", ImageIO.read(new File("images/metal.png")), 300, 75);
plastic = new squareImage(baharKaPanel, "0", "Plastic", ImageIO.read(new File("images/plastic.png")), 400, 75);
screwD = new squareImage(baharKaPanel, "0", "Plastic", ImageIO.read(new File("images/screwdriver.png")), 10, 100);
hammer = new squareImage(baharKaPanel, "0", "Hammer", ImageIO.read(new File("images/hammer.png")), 10, 180);
pliers = new squareImage(baharKaPanel,"0", "Pliers", ImageIO.read(new File("images/pliers.png")), 10, 340);
scissors = new squareImage(baharKaPanel,"0", "Scissors", ImageIO.read(new File("images/scissors.png")), 10, 420);
brush = new squareImage(baharKaPanel, "0", "Paint Brush", ImageIO.read(new File("images/paintbrush.png")), 10, 260);
wood.repaint();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

addEverything();

}

protected void addEverything(){

baharKaPanel.add(wood);
baharKaPanel.add(metal);
baharKaPanel.add(plastic);
baharKaPanel.add(screwD);
baharKaPanel.add(hammer);
baharKaPanel.add(pliers);
baharKaPanel.add(scissors);
baharKaPanel.add(brush);
}

最佳答案

这和您对空布局的使用将创建一个 0 x 0 大小的组件:

this.setBounds(a, b, getWidth(), getHeight());

如果您此时输入代码并打印出 getWidth()getHeight() 在未渲染的组件中返回的内容,您将发现是 0 或 1。

无论如何,您都不应该使用空布局或设置边界,而应该使用尊重首选尺寸的布局管理器,因为使用空布局会导致 GUI 非常不灵活,虽然它们在一个平台上看起来不错,但在一个平台上看起来很糟糕大多数其他平台或屏幕分辨率,并且很难更新和维护。

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

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