Java 在JLabel上打印一个正方形,并将其存储在作为JLabel内容的图像中
我需要向用户显示一个图像,并引导他用鼠标选择一个区域。因此,我创建并显示了一个JFrame,在其中我使用ImageIcon初始化了一个JLabel。 在我添加并覆盖JLabel上的mouseEventListner之后。我的工作计划是,第一次和第二次单击鼠标,以获得相关点,用作识别选定区域的边。我正确地理解了要点。但我无法正确地将以前的JLabel更改为绘制了矩形的新JLabel 在JFrame中显示的图像(在其像素上)上存储所选区域的信息非常重要,因为马上我需要在像素级别管理这些信息。 下面是我初始化JFrame的步骤:Java 在JLabel上打印一个正方形,并将其存储在作为JLabel内容的图像中,java,image,swing,jframe,jlabel,Java,Image,Swing,Jframe,Jlabel,我需要向用户显示一个图像,并引导他用鼠标选择一个区域。因此,我创建并显示了一个JFrame,在其中我使用ImageIcon初始化了一个JLabel。 在我添加并覆盖JLabel上的mouseEventListner之后。我的工作计划是,第一次和第二次单击鼠标,以获得相关点,用作识别选定区域的边。我正确地理解了要点。但我无法正确地将以前的JLabel更改为绘制了矩形的新JLabel 在JFrame中显示的图像(在其像素上)上存储所选区域的信息非常重要,因为马上我需要在像素级别管理这些信息。 下面是
JFrame frame = new JFrame();
ImageIcon icon = new ImageIcon(imgPath);
JLabel label = new JLabel(icon);
frame.add(label);
frame.setTitle(imgPath.substring(imgPath.lastIndexOf("\\")+1));
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
frame.setResizable(false);
//function to select area by mouse click
addHandlerToDraw(label,frame,icon);
这是我调用的函数:
private void addHandlerToDraw(JLabel label, JFrame frame, ImageIcon img) {
label.addMouseListener(new MouseAdapter() {
Point start = new Point();
Rectangle captureRect;
int k=0;
@Override
public void mouseClicked(java.awt.event.MouseEvent e) {
if(k==0) {
start = e.getPoint();
k=1;
} else {
k = 0;
Point end = e.getPoint();
captureRect = new Rectangle(start, new Dimension(end.x-start.x, end.y-start.y));
}
repaint(captureRect, frame, img, label);
label.repaint();
}
});
最后,这是一个功能,因为我想用显示选定区域的图像切换上一个图像(没有选定区域):
private void repaint(Rectangle rect, JFrame frame, ImageIcon img, JLabel label) {
BufferedImage bi = new BufferedImage(
img.getIconWidth(),
img.getIconHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics2D g1 = bi.createGraphics();
g1.setColor(new Color(200,30,30,45));
if(rect != null) {
g1.drawRect(rect.x, rect.y, rect.width, rect.height);
frame.remove(label);
frame.add(new JLabel(new ImageIcon(bi)));
frame.setVisible(true);
}}
正如我之前所说的,即使我正确地计算了矩形,我也无法在新的JLabel和JFrame中存储和显示它。我哪里错了?1。我不会使用
JLabel
为此,我会使用一个自定义组件来绘制buffereImage
,有关更多详细信息,请参阅。2.我不知道您为什么要尝试创建标签,而您可以将图标替换为setIcon
For,1。我不会使用JLabel
为此,我会使用一个自定义组件来绘制buffereImage
,有关更多详细信息,请参阅。2.我不知道你为什么要创建标签,而你可以用setIcon
替换图标,