【发布时间】:2016-07-23 14:06:34
【问题描述】:
我的问题是如何将图像显示到 JPanel 中?此处询问类似问题的其他主题对我来说并不清楚我该怎么做。
我的项目文件夹中有一个目录,其中包含图像文件 Project Folder/GUI/img,特别是 gray.png 和 green.png,我想在 JPanel 中显示它们。
我尝试使用在其他帖子中找到的ImageIcon 和JLabel 使用以下代码:
ImageIcon image = new ImageIcon("GUI/img/gray.png");
JLabel label = new JLabel(image);
//JPanel panel is already initialized by the IDE
panel.add(label)
但不起作用...JPanel 保持为空,不显示任何图像。我该怎么做?
除此之外,我希望在执行某些操作(例如按下按钮)时,JPanel 中的图像会发生变化(gray.png 为 green.png)。我可以通过相同的方法将其归档以在JPanel 中显示图像对吗?
提前致谢!
编辑:这是获取此代码的测试代码示例。初始化由 IDE 自动完成。
import java.awt.Image;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class Sample extends javax.swing.JFrame {
public Sample() {
initComponents();
}
//Initialization
private void initComponents() {
PanelImage = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
});
javax.swing.GroupLayout PanelImageLayout = new javax.swing.GroupLayout(PanelImage);
PanelImage.setLayout(PanelImageLayout);
PanelImageLayout.setHorizontalGroup(
PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
PanelImageLayout.setVerticalGroup(
PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(61, 61, 61)
.addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(239, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(45, 45, 45)
.addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(155, Short.MAX_VALUE))
);
pack();
}
private void formWindowOpened(java.awt.event.WindowEvent evt) {
try {
DisplayImage(PanelImage, "/GUI/img/gray.png");
} catch (Exception ex) {
Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex);
}
}
//For display the url image in a JPanel
private void DisplayImage(JPanel jp, String url) throws IOException, Exception {
try {
Image image=ImageIO.read(this.getClass().getResource(url));
ImageIcon imageicon=new ImageIcon(image);
JLabel label=new JLabel(imageicon);
jp.add(label);
} catch (IOException ex) {
throw new IOException();
} catch (Exception ex) {
throw new Exception();
}
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Sample.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Sample().setVisible(true);
}
});
}
// Variables declaration
private javax.swing.JPanel PanelImage;
}
private void DisplayImage(JPanel jp, String url) 是我显示图像所需的工作,来自JPanel jp 中的网址String url
【问题讨论】:
-
发布一个完整的最小示例来重现问题。
-
尝试使用
ImageIO.read(new File("GUI/img/gray.png")),如果由于某种原因无法加载图像,则会抛出异常,而ImageIcon不会。更多详情请见Reading/Loading an Image -
@JBNizet 在涉及图像的示例中,我想添加以下建议 - 例如,获取图像的一种方法是热链接到 this Q&A 中看到的图像。
-
看起来像添加组件问题(没有触发重新布局)。将标签添加到面板后,尝试重新验证并重新绘制面板(
panel.revalidate();和panel.repaint();)。 -
@SergiyMedvynskyy 尝试了两种方法
panel.revalidate()和panel.repaint()均无效。面板仍然不显示图像。