使用 JLayer 在图像上放置网格
Placing Grid over Image using JLayer
我想在图像上放置一个网格。我使用 JLabel
使用 paintComponent
方法保存图像,我使用此方法是因为图像将在我的项目的不同阶段发生变化,对于 JLayer
class GridDrawer extends LayerUI
这有助于绘制网格(对于较小的示例,我只使用了 drawRect()
方法)。
我的代码:
网格照片(主要)Class:
/*
* 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);
}
}
});
}
}
图形界面 Class:
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
class 的 paintComponent
方法仅绘制 Rectangle
.
请告诉我我的代码有什么问题,或者除了使用 JLayer
将网格放置在 Image
之外还有其他方法吗?
输出。
LayerUI
没有 paintComponent(...)
方法。
无论何时覆盖方法,请确保使用 @Override
,这样您就知道覆盖了正确的方法:
@Override
public void paint(...)
并且不要忘记调用 super.paint(...).
阅读 How to Decorate Components With JLayer Class 上的 Swing 教程,了解更多信息和工作示例。
我想在图像上放置一个网格。我使用 JLabel
使用 paintComponent
方法保存图像,我使用此方法是因为图像将在我的项目的不同阶段发生变化,对于 JLayer
class GridDrawer extends LayerUI
这有助于绘制网格(对于较小的示例,我只使用了 drawRect()
方法)。
我的代码:
网格照片(主要)Class:
/*
* 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);
}
}
});
}
}
图形界面 Class:
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
class 的 paintComponent
方法仅绘制 Rectangle
.
请告诉我我的代码有什么问题,或者除了使用 JLayer
将网格放置在 Image
之外还有其他方法吗?
输出。
LayerUI
没有 paintComponent(...)
方法。
无论何时覆盖方法,请确保使用 @Override
,这样您就知道覆盖了正确的方法:
@Override
public void paint(...)
并且不要忘记调用 super.paint(...).
阅读 How to Decorate Components With JLayer Class 上的 Swing 教程,了解更多信息和工作示例。