Java 使用JLayer在图像上放置网格

Java 使用JLayer在图像上放置网格,java,swing,jlayer,Java,Swing,Jlayer,我想在图像上放置一个网格。我使用了一个JLabel来保存图像,它使用paintComponent方法,因为图像在我的项目的不同阶段会发生变化,对于JLayer类GridDrawer扩展LayerUI,这有助于绘制网格(对于较小的示例,我只使用了drawRect()方法) 我的代码: GridPhoto(主要)类别: GUI类: package gridphoto; import java.awt.image.BufferedImage; import java.awt.B

我想在图像上放置一个网格。我使用了一个
JLabel
来保存图像,它使用
paintComponent
方法,因为图像在我的项目的不同阶段会发生变化,对于
JLayer
GridDrawer扩展LayerUI
,这有助于绘制网格(对于较小的示例,我只使用了
drawRect()
方法)

我的代码:

GridPhoto(主要)类别:

GUI类:

   package gridphoto;

    import java.awt.image.BufferedImage;
    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JLayer;
    import javax.swing.plaf.LayerUI;

    public class GUI {
    JFrame frame;
    JPanel panel;
    JLayer<JLabel> GridLayer;
    JLabel imagelabel;
    LayerUI<JLabel> GridUI;
    BufferedImage img;

    public GUI() throws IOException {
        frame = new JFrame("GridImage Test");
        panel = new JPanel();
        img = ImageIO.read(new File("/Users/VJ/Desktop/gs.png"));
        imagelabel = new JLabel() {
            public void paintComponent(Graphics g) {
               g.drawImage(img.getScaledInstance(500, 500, BOTTOM), 0, 0, null);
            }
        };
        GridUI = new GridDrawer();
        GridLayer = new JLayer(imagelabel, GridUI);
        panel.setLayout(new BorderLayout());
        frame.setLayout(new BorderLayout());
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 700);
     panel.add(GridLayer);
        frame.add(panel);
        frame.setVisible(true);

    }

    public class GridDrawer extends LayerUI<JLabel> {

        public void paintComponent(Graphics g) {
            g.drawRect(0, 0, 250, 250);
        }

    }

}
package-gridphoto;
导入java.awt.image.buffereImage;
导入java.awt.BorderLayout;
导入java.awt.Graphics;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JLayer;
导入javax.swing.plaf.LayerUI;
公共类GUI{
JFrame框架;
JPanel小组;
JLayer网格层;
JLabel图像标签;
莱瑞·格里迪;
缓冲图像img;
公共GUI()引发IOException{
帧=新JFrame(“GridImage测试”);
panel=新的JPanel();
img=ImageIO.read(新文件(“/Users/VJ/Desktop/gs.png”);
imagelabel=新的JLabel(){
公共组件(图形g){
g、 drawImage(img.getScaledInstance(500500,底部),0,0,null);
}
};
GridUI=新的GridDrawer();
GridLayer=新的JLayer(imagelabel,GridUI);
panel.setLayout(新的BorderLayout());
frame.setLayout(新的BorderLayout());
frame.setresizeable(false);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架设置尺寸(500700);
panel.add(GridLayer);
框架。添加(面板);
frame.setVisible(true);
}
公共类GridDrawer扩展了{
公共组件(图形g){
g、 drawRect(0,0,250,250);
}
}
}
我的问题是,即使将
JLayer
添加到
JPanel
中,它也只显示图像,而不显示网格。 例如,
GridDrawer
类的
paintComponent
方法仅绘制一个
矩形

请告诉我我的代码有什么问题,或者除了使用
JLayer
将网格放置在
图像上之外,还有其他方法吗

输出。
LayerUI
没有
paintComponent(…)
方法

每当重写方法时,请确保使用
@override
,以便知道您正在重写正确的方法:

@Override
public void paint(...)
别忘了调用super.paint(…)


阅读上的Swing教程以了解更多信息和工作示例。

是的,我知道这一点,很抱歉,但即使使用paint()方法也没有任何作用。@JaymitDesai,您的代码与教程中工作示例中的代码有何不同?发布更新的代码,包括用于执行类的main()方法,以便人们可以进行测试。添加了具有main方法的类。@JaymitDesai,您发布的代码仍在使用paintComponent()。你做了什么来调试你的代码?你看了工作示例了吗?您是否修改了工作示例。做一些基本的调试。努力吧,我们不是来为你工作的!!!使用super.paint()解决了这个问题,很抱歉我发了一篇帖子,我会确保下次我会按照规则创建一篇。1)为了更快地获得更好的帮助,发布一篇(最简单的完整可验证示例)或(简短、自含、正确的示例)。该代码需要一个
main(String[])
才能在屏幕上显示为“完整”。2) 获取示例图像的一种方法是热链接到中看到的图像。
@Override
public void paint(...)