Java Swing在MigLayout中添加图像代码似乎不起作用?
因此,我有自己的自定义Java Swing在MigLayout中添加图像代码似乎不起作用?,java,image,swing,javax.imageio,miglayout,Java,Image,Swing,Javax.imageio,Miglayout,因此,我有自己的自定义JFrame,我试图在其中创建一个自动调整大小的图像,以包含在我的JFrame的内容JPanel,frameContent中。我的JPanel布局管理器是migloayout,因此我想我应该再次创建JPanel的子级,名为ImagePanel。下面是我的ImagePanel类的最终外观: class ImagePanel extends JPanel{ private static final long serialVersionUID = -56020320216
JFrame
,我试图在其中创建一个自动调整大小的图像,以包含在我的JFrame
的内容JPanel
,frameContent
中。我的JPanel
布局管理器是migloayout
,因此我想我应该再次创建JPanel
的子级,名为ImagePanel
。下面是我的ImagePanel类
的最终外观:
class ImagePanel extends JPanel{
private static final long serialVersionUID = -5602032021645365870L;
private BufferedImage image;
public ImagePanel() {
try {
image = ImageIO.read(new File(getClass().getResource("../res/Title.png").toURI()));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, getWidth(), getHeight(), null);
}
}
现在由于某种原因,它看起来并不是真的在“工作”。当我设置主JFrame
的内容时,我调用:
framecontent.add(new ImagePanel(), "pos 5% 5% 95% 45%");
这并不是说它没有添加组件,因为有了这段代码,我可以看到以下屏幕:
请注意它是如何在灰色背景下勾勒出该区域的,这意味着正在运行paintComponent(g)
方法,并且程序也没有输出任何错误,这很奇怪,这意味着它正在查找我的图像,只是没有放置它
以下是我的文件层次结构的外观:
Project Folder >
src >
res >
Title.png (Picture I want to retrieve)
guiwork >
Working.class (Class that is running instructions/ main)
已将其全部修复,以下是自动调整大小的结果:
请注意它是如何在灰色背景下勾勒出该区域的,这意味着正在运行paintComponent(g)方法,并且该程序也没有输出任何错误,这很奇怪,这意味着它正在查找我的图像,而不是放置它
不是这样,因为空映像不会抛出错误。为了证明这一点,在paintComponent方法中测试image变量,您可能会发现它实际上为null
i、 例如,试试这个:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("image is null: " + (image == null)); // TODO: Delete this
g.drawImage(image, getWidth(), getHeight(), null);
}
解决方案:不要将资源更改为文件,而是按原样使用资源,并确保在正确的位置查找资源
编辑
哦chit,您正在绘制超出组件边界的图像:
g.drawImage(image, getWidth(), getHeight(), null);
尝试:
编辑2
如果您尝试一个简单的测试程序,比如:
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
public class TestImage {
public TestImage() throws IOException {
String path = "/res/Title.png";
BufferedImage img = ImageIO.read(getClass().getResource(path));
ImageIcon icon = new ImageIcon(img);
JOptionPane.showMessageDialog(null, icon);
}
public static void main(String[] args) {
try {
new TestImage();
} catch (IOException e) {
e.printStackTrace();
}
}
}
并确保将其放置在与当前类相同的位置。它运行吗?对于那些可能无法理解气垫船答案的人: 假设您有一个面板,希望在其中添加一个可缩放的图像,下面的代码将为您执行此操作
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;
public class MasterSlidePanel extends JPanel {
private ImageIcon imageIcon;
private JLabel image;
public MasterSlidePanel() {
super(new MigLayout("", "2% [] 2%", "2% [] 2%"));
}
@Override
protected void paintComponent(Graphics g) {
image.setIcon(new ImageIcon(imageIcon.getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH)));
super.paintComponent(g);
}
public void setImage(SlidePanel panel) {
imageIcon = <Where you get the imageIcon>;
image = new JLabel();
image.setMinimumSize(new Dimension(10, 10));
image.setPreferredSize(new Dimension(10, 10));
this.add(image, "width 96%, height 96%");
}
}
import net.miginfocom.swing.migloayout;
导入javax.swing.*;
导入java.awt.*;
公共类MasterSlidePanel扩展了JPanel{
私人图像图标;
私有JLabel图像;
公共主幻灯片面板(){
超级(新的MIG布局(“,”2%[]2%“,”2%[]2%”);
}
@凌驾
受保护组件(图形g){
setIcon(新的ImageIcon(ImageIcon.getImage().getScaledInstance(image.getWidth(),image.getHeight(),image.SCALE_-SMOOTH));
超级组件(g);
}
公共无效设置图像(滑动面板){
图像图标=;
image=新的JLabel();
图像。设置最小尺寸(新尺寸(10,10));
image.setPreferredSize(新维度(10,10));
添加(图像,“宽度96%,高度96%”;
}
}
我们在面板中添加了两个新成员:image和imageIcon。当应用程序需要绘制面板时,会加载imageIcon的缩放图标并将其提供给image
为了防止0高度/宽度错误,我们向JLabel添加了一个minimumsize
希望这有帮助
信用卡仍然会被放在装满鳗鱼的气垫船上。@tanishalfelven:嗯,它输出了什么?@tanishalfelven:请看我的编辑,开头是“哦,chit”。@tanishalfelven:你根本不应该在这里使用文件。正如我提到的,坚持使用资源。类的
getResource()
返回URL,而ImageIO.read(…)
接受URL参数。使用它。@tanishalfelven:关于路径,您可能希望发布一个与类文件相关的路径图像。@tanishalfelven:请参阅上一条注释上方的注释。如果您使用的是Eclipse,请显示包资源管理器的图像,向我们显示您的图像相对于类文件/项目的位置。
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;
public class MasterSlidePanel extends JPanel {
private ImageIcon imageIcon;
private JLabel image;
public MasterSlidePanel() {
super(new MigLayout("", "2% [] 2%", "2% [] 2%"));
}
@Override
protected void paintComponent(Graphics g) {
image.setIcon(new ImageIcon(imageIcon.getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH)));
super.paintComponent(g);
}
public void setImage(SlidePanel panel) {
imageIcon = <Where you get the imageIcon>;
image = new JLabel();
image.setMinimumSize(new Dimension(10, 10));
image.setPreferredSize(new Dimension(10, 10));
this.add(image, "width 96%, height 96%");
}
}