java - 使用 JLayer 将网格放置在图像上

标签 java swing jlayer

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

我的代码:

GridPhoto(主)类:

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package gridphoto;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;

/**
 *
 * @author VJ
 */
public class GridPhoto {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    new GUI();
                } catch (IOException ex) {
                    Logger.getLogger(GridPhoto.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        });
    }

}

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);
        }

    }

}

我的问题是,即使将 JLayer 添加到 JPanel 后,它也只显示图像而不显示网格。 例如,GridDrawer 类的 paintComponent 方法仅绘制一个 矩形

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

输出。

最佳答案

LayerUI 没有 paintComponent(...) 方法。

每当您重写方法时,请确保使用@Override,这样您就知道您正在重写正确的方法:

@Override
public void paint(...)

并且不要忘记调用 super.paint(...)。

阅读 How to Decorate Components With JLayer Class 上的 Swing 教程了解更多信息和工作示例。

关于java - 使用 JLayer 将网格放置在图像上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239699/

相关文章:

java - 将 SQLite 数据库中的初始列值设置为 0

java - 对 Facelets 页面中的某些元素使用相同的消息

Java:将类导入到 Jframe

java - JPanel 以额外宽度绘制

java - Java 应用程序的安全桌面模式效果

java - 从 MP3 文件中获取解码后的字节流

java - 使用 fargate 作为 worker 的 AWS Step Functions 工作流程 - 如何将输出发送到下一步?

java - 如何重新连接okhttp-ws

java - 平均/最小/最大方法在带有窗口生成器的 java eclipse 中不起作用

java - 我按照 oracle 中关于 JLayer 的教程进行操作,但它不适用于此代码