java - 在 JLabel 上打印一个正方形并将其存储在作为 JLabel 内容的图像中
问题描述
我需要向用户显示图像并引导他用鼠标选择一个区域。因此,我创建并显示了一个 JFrame,其中我放置了一个使用 ImageIcon 初始化的 JLabel。在我添加并覆盖 JLabel 上的 mouseEventListner 之后。我的工作计划是第一次和第二次单击鼠标以获取相关点以用作边缘识别所选区域。我正确地得到了分数。但我无法用绘制矩形的新 JLabel 正确更改以前的 JLabel。
将所选区域的信息存储在 JFrame 中显示的图像(在其像素上)上很重要,因为在第二个时刻,我需要在像素级别管理这些信息。
所以这里是我初始化 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);
}}
正如我之前 sed 一样,即使我正确计算了矩形,我也无法在新的 JLabel 和 JFrame 中存储和显示它。我哪里错了?
解决方案
推荐阅读
- reactjs - 找不到命名空间“GameContext”
- ms-access - 标签中的变量
- ios - Mac Catalyst 替代 iOS panGestureRecognizer.location
- php - 无法使用 Laravel 8 在 CRUD 中编辑项目
- javascript - 如何使用 webkeys() 在 webview 中插入文本并使用 Espresso 触发 onChange 事件
- sql-server - 使用信息模式迭代多个数据库
- .net - 使用别名时 Oracle 托管数据访问似乎忽略了端口
- ios - 变量更改(切换翻转)时刷新选项卡的 UI 而无需重新加载应用程序
- amazon-web-services - Cloudformation 初始化 - 安装 docker
- amazon-web-services - Amazon Cognito - 您能否在使用客户端凭证流时向 access_token 添加自定义声明