Java 在JPanel上添加图像和按钮
我的JFrame如下所示:Java 在JPanel上添加图像和按钮,java,swing,Java,Swing,我的JFrame如下所示: public class TestJFrame extends JFrame { public RecyclingMachinesGui(String title) { super (title); Container container = getContentPane(); container.setLayout(new FlowLayout()); Panel r = new Panel
public class TestJFrame extends JFrame {
public RecyclingMachinesGui(String title) {
super (title);
Container container = getContentPane();
container.setLayout(new FlowLayout());
Panel r = new Panel();
Jbutton j = new JButton("Recycle Item");
r.add(j);
container.add(r);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(500,500);
setVisible(true);
}
private class Panel extends JPanel {
private BufferedImage image;
public Panel() {
try {
image = ImageIO.read(new File("./temp.png"));
}catch (IOException e) {
e.getMessage().toString();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
}
在我的主方法中的上述代码中,当我运行newtestjframe()
时,出于某种原因,我只在面板
中看到JButton j
(已添加到容器中),而在面板中看不到图像。是否未调用我的面板中的paintComponent
方法
我想在面板的顶部有一张图片,底部有一个按钮。有人能解释为什么不发生这种情况吗?您的
面板中的图像不显示,
因为面板
没有合适的首选尺寸。
因此,布局管理器(FlowLayout
)不知道大小
给面板,给它一个非常小的正方形大小。
因此,您的面板
的paintComponent
实际上被调用,
但它只是在一个看不见的小区域上作画
您可以在面板的构造函数中轻松修复它,
加载图像后立即调用setPreferredSize
:
image = ImageIO.read(new File("./temp.png"));
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
面板中的图像不显示,
因为面板
没有合适的首选尺寸。
因此,布局管理器(FlowLayout
)不知道大小
给面板,给它一个非常小的正方形大小。
因此,您的面板
的paintComponent
实际上被调用,
但它只是在一个看不见的小区域上作画
您可以在面板的构造函数中轻松修复它,
加载图像后立即调用setPreferredSize
:
image = ImageIO.read(new File("./temp.png"));
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
我想在面板的顶部有一张图片,底部有一个按钮。有人能解释为什么没有发生这种情况吗
好的,所以你真的不需要自己绘制图像,一个JLabel
本身会做得很好,然后你只需要使用一个BorderLayout
将标签添加到中间,将按钮添加到南部,例如
public class TestJFrame extends JFrame {
public RecyclingMachinesGui(String title) {
super (title);
Container container = getContentPane();
container.setLayout(new FlowLayout());
JPanel r = new JPanel(new BorderLayout());
try {
r.add(new JLabel(new ImageIcon(ImageIO.read(new File("./temp.png")))));
}catch (IOException e) {
e.getMessage().toString();
}
Jbutton j = new JButton("Recycle Item");
r.add(j, BorderLayout.SOUTH);
container.add(r);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(500,500);
setVisible(true);
}
}
您当前的方法是将按钮放置在图像上,如果您想将图像用作背景,这一点非常好
我想在面板的顶部有一张图片,底部有一个按钮。有人能解释为什么没有发生这种情况吗
好的,所以你真的不需要自己绘制图像,一个JLabel
本身会做得很好,然后你只需要使用一个BorderLayout
将标签添加到中间,将按钮添加到南部,例如
public class TestJFrame extends JFrame {
public RecyclingMachinesGui(String title) {
super (title);
Container container = getContentPane();
container.setLayout(new FlowLayout());
JPanel r = new JPanel(new BorderLayout());
try {
r.add(new JLabel(new ImageIcon(ImageIO.read(new File("./temp.png")))));
}catch (IOException e) {
e.getMessage().toString();
}
Jbutton j = new JButton("Recycle Item");
r.add(j, BorderLayout.SOUTH);
container.add(r);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(500,500);
setVisible(true);
}
}
您当前的方法是将按钮放置在图像上,如果您想将图像用作背景,这非常好图像是否已加载?如果要在顶部显示图像并在面板上显示按钮,请使用边框布局
,将图像包装在JLabel
中并将其添加到中间位置,然后将按钮添加到南部位置使用面板
类的边框布局?部署时,应用程序资源将成为嵌入式资源,因此,明智的做法是,现在就开始访问它们,就好像它们是。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。@1290否,contentPane
中的一个,但我不想在面板上使用borderlayout吗?所以我可以把图像放在北面,把按钮放在南面?图像已经加载了吗?如果要在顶部显示图像并在面板上显示按钮,请使用边框布局
,将图像包装在JLabel
中并将其添加到中间位置,然后将按钮添加到南部位置使用面板
类的边框布局?部署时,应用程序资源将成为嵌入式资源,因此,明智的做法是,现在就开始访问它们,就好像它们是。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。@1290否,contentPane
中的一个,但我不想在面板上使用borderlayout吗?因此,我可以将图像放在北面,将按钮放在南面,“您可以轻松地修复…”。通过使用JLabel
来显示图像。“您可以轻松地修复…”。通过使用JLabel
来显示图像。这是一个基于您的评论的想法,因此我不能100%确定它是否符合您的总体要求,但这是实现你似乎想要做的事情的另一种方式;)啊,好吧,这样更有意义。我将采用这种方法。非常感谢。只是出于好奇,在我的面板子类中,PaintComponent方法究竟是何时调用的?当我实例化面板
子类时?编辑:这正是我需要的。:)@1290在屏幕上“实现”组件之前,不会调用您的paintComponent
,需要进行许多操作,但只需说,它需要添加到容器中,并且在绘制组件之前,容器需要连接到可见的窗口/框架上。。。作为简短的描述;)这是一个基于您的评论的想法,所以我不能100%确定它是否能满足您的总体要求,但这是实现您似乎想做的事情的另一种方式;)啊,好吧,这样更有意义。我将采用这种方法。非常感谢。只是出于好奇,在我的面板子类中,PaintComponent方法究竟是何时调用的?当我实例化面板
子类时?编辑:这正是我需要的。:)@1290在屏幕上“实现”组件之前,不会调用您的paintComponent
,需要进行许多操作,但只需说,它需要添加到容器中,并且在绘制组件之前,容器需要连接到可见的窗口/框架上。。。作为简短的描述;)