gpt4 book ai didi

java - 为什么当我为我的 JFrame 使用 FlowLayout 时我的图像没有出现?

转载 作者:行者123 更新时间:2023-11-30 08:23:22 25 4
gpt4 key购买 nike

有一个问题我不明白:如果 JFrame 的布局是 ,为什么我可以使用 drawImage() 方法绘制图像code>BorderLayoutGridLayout 但不是 GridbagLayoutFlowLayoutBoxLayout?有人可以给我解释一下吗?

代码如下:

package footballQuestioner;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;




public class attempter {

public static void main(String[] args) {
JFrame frame = new Beispielfenster();

}

}

class Beispielfenster extends JFrame {

private class TransparentBG extends JLabel {

BufferedImage image;

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

try {
image = ImageIO
.read(TransparentBG.class
.getClassLoader()
.getResourceAsStream(
"footballQuestioner/rightAnswerSign.png"));

} catch (IOException e) {
e.printStackTrace();
}

Graphics2D g2d = (Graphics2D) g;

g2d.drawImage(image, 0, 0, null);
g2d.dispose();


}

}



public Beispielfenster() {



//setLayout(new FlowLayout());
JPanel panel=new JPanel(new BorderLayout());

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



JLabel label=new TransparentBG();

panel.add(label);

add(panel);

pack();

centeringWindow();
setVisible(true);

}

public void centeringWindow() {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x;
int y;

x = (int) (dimension.getWidth() - getWidth()) / 2;
y = (int) (dimension.getHeight() - getHeight()) / 2;

setLocation(x, y);
}



}

最佳答案

因为对于前两个布局,JLabel 将填充容器,这里是 JPanel。对于其他布局,它将调整大小为其 preferredSize,即 0。如果您希望使用其他布局,请考虑覆盖 getPreferredSize。

另请注意:

  • 不应该在没有 paintComponent 方法的情况下读入图像文件。
  • 如果可能,您不应该重新读取图像文件(如果您以重复调用的方法读取图像,就会发生这种情况)。一次读取它们,例如在构造函数中,并将它们存储在一个字段中。
  • 您不应处置 JVM 提供给您的 Graphics 对象,而应处置您自己创建的对象(例如来自 BufferedImage)。

编辑
例如,像这样:

private class TransparentBG extends JLabel {
BufferedImage image;

public TransparentBG() throws IOException {
image = ImageIO.read(TransparentBG.class.getClassLoader()
.getResourceAsStream("footballQuestioner/rightAnswerSign.png"));
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if (image != null) {
g2d.drawImage(image, 0, 0, null);
}
// g2d.dispose();
}

@Override
public Dimension getPreferredSize() {
if (image != null) {
int w = image.getWidth();
int h = image.getHeight();
return new Dimension(w, h);
}
return super.getPreferredSize();
}
}

关于java - 为什么当我为我的 JFrame 使用 FlowLayout 时我的图像没有出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728581/

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