一个扩展JPanel的类,我想在我的JFrame中添加CENTER属性,它是一个BorderLayout



我有一个名为panneau:的类

public class Panneau extends JPanel { 
public void paintComponent(Graphics g){
try {
Image img = ImageIO.read(new File("src/disantiammo/image/image.png"));
g.drawImage(img, 0, 0, this);
} catch (IOException e) {
e.printStackTrace();
}   
}
}
//for now it is not doing anything but it will...

在JFrame中,我有一些带有其他元素的JPanel。

JFrame的布局是BorderLayout

问题是这个pan必须是"java.awt.BorderLayout.CENTER",我只能这样放置:

this.setContentPane(new Panneau());

如何将其放置在"中心"?

我试过之类的东西

this.getContentPane().add(new Panneau(), java.awt.BorderLayout.CENTER);

似乎什么都不起作用——我唯一能做的就是把"panneau"放在我的JFrame里。编辑:

这听起来可能很简单,但我不明白为什么我不能做到这一点,我一直在尝试

我有jDialog,它在BorderLayout中,在"南"、"北"one_answers"中心"中,我有带元素的jPanel(在"中心"的jPanel中没有任何元素)。"中心"jPanel被称为Map。

我喜欢这样的事情:在主中

Graphics t = Map.getGraphics();
paintComponent(t);

总的来说不是。

public void paintComponent(Graphics g){
super.paintComponents(g);
g.drawLine(0, 0, 50, 150);
}

我什么都画不出来。

我发现,使组件完全居中的最简单方法是给容器一个GridBagLayout,然后将单个组件添加到该容器中,但不使用任何约束。

附带问题:您的代码在绘画方法中读取图像——永远不要这样做。相反,读取中的图像一次并将其存储在变量中。然后在绘制方法中显示。还要确保在覆盖中调用super的绘制方法。

例如

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class CenteredImage extends JPanel {
private static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia/commons/"
+ "thumb/f/f8/Portrait_d%27une_Femme_%C3%A0_sa_Toilette%2C_by_Titian%2C_"
+ "from_C2RMF_retouched.jpg/300px-Portrait_d%27une_Femme_%C3%A0_sa_"
+ "Toilette%2C_by_Titian%2C_from_C2RMF_retouched.jpg";
private BufferedImage img;
public CenteredImage(BufferedImage img) {
this.img = img;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, this);
}
}
@Override
public Dimension getPreferredSize() {
Dimension prefSize = super.getPreferredSize();
if (isPreferredSizeSet() || img == null) {
return super.getPreferredSize();
}
return new Dimension(img.getWidth(), img.getHeight());
}

private static void createAndShowGui() {
BufferedImage img = null;
try {
URL imgUrl = new URL(IMG_PATH);
img = ImageIO.read(imgUrl);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
CenteredImage mainPanel = new CenteredImage(img);
JFrame frame = new JFrame("CenteredImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(800, 650));
frame.getContentPane().setLayout(new GridBagLayout());
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}

编辑:使用包装JPanel,如注释所示:

您在评论中声明:

谢谢你,但我的意思是:borderLayout中有一个JFrame/JDialog,我想把"panneau"放在它的中间位置,也许我不知道怎么说。。。"南"、"北"等都有元素。。。

然后将生成图像的JPanel包装在使用GridBagLayout的另一个JPanel中,并将包装JPanel添加到JFrame BorderLayout.CENTER

private static void createAndShowGui() {
BufferedImage img = null;
try {
URL imgUrl = new URL(IMG_PATH);
img = ImageIO.read(imgUrl);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
CenteredImage centeredImagePanel = new CenteredImage(img);
JPanel wrapperPanel = new JPanel(new GridBagLayout());
wrapperPanel.add(centeredImagePanel);
JFrame frame = new JFrame("CenteredImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(800, 650));
// frame.getContentPane().setLayout(new GridBagLayout());
frame.getContentPane().add(wrapperPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}

您的核心问题(很可能)是您的面板没有向布局管理器提供任何大小提示,以便其决定需要多少大小。

为了实现这一点,您需要覆盖面板的getPreferredSize方法,以返回组件想要的大小。

这带来了许多其他问题:

  1. 不要在paintComponent中加载图像,这很耗时,而且会使UI显示为冻结状态。此外,paintComponent会被调用很多,所以您应该避免在其中执行任何需要时间的操作
  2. 您不应该在代码中的任何位置引用src。在这种情况下,您将需要使用Class#getResource来获得对图像的引用以加载它
  3. 你当然应该打电话给super.paintComponent

例如

public class Panneau extends JPanel { 
private BufferedImage img;
public Panneau() throws IOException {
img = ImageIO.read(getClass().getResource("/disantiammo/image/image.png")); 
}
public void getPrefferedSize() {
return img == null ? new Dimension(0, 0) : new Dimension(img.getWidth(), img.getHeight());
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, this);
}
}
}

附言:我没有试着把图像放在容器的中心,但如果布局经理尊重组件的大小,就不会有什么不同

最新更新