用chatGPT写 java版 标签设计工具 快速获取坐标 字大小

bash 复制代码
java 写一个带界面的 通用标签设计工具 要求
1.点按钮 选择一张bmp图片 显示在工作区控件上作为模板,图片如果太大,拖动垂直或水平滚动条可以查看图片的第个地方。
2.鼠标在图片上移动会显示红色水平和垂直辅助线,擦除原来的痕迹,并显示xy相对于图片原点的位置
3.点文字按钮,再在图片上点击,会在图片上点击的位置显示示例文字"F88888888888888"
4.点条型码按钮,再在在图片上点击,会在图片上点击的位置显示条型码和示例文字"F88888888888888",文字在条型码的下面并居中,条型码的内容是示例文字。
5.点二维码按钮,再在在图片上点击,会在图片上点击的位置显示条型码和示例文字"F88888888888888",文字在二维码的下面并居中,二维码的内容是示例文字。
6.点击图片上的文字 或 条型码 或 二维码 可以拖动它的位置,并设置它的属性,比如文字的字体 大小等
7.点保存可以把编辑好的所有内容系列化保存,点打开可以把所有内容反系列化到界面,点保存BMP可以把编辑好的内容导出为bmp图片。
8.点打印可以所有内容保存为一张BMP图片并打印出来。

太长,太复杂的,它一次生成不了那么多,会偷懒。

先实现

bash 复制代码
1.点按钮 选择一张bmp图片 显示在工作区控件上作为模板,图片如果太大,拖动垂直或水平滚动条可以查看图片的第个地方。
2.鼠标在图片上移动会显示红色水平和垂直辅助线,擦除原来的痕迹,并显示xy相对于图片原点的位置

效果

代码

为了实现一个带界面的通用标签设计工具,特别是满足你的前两个要求,我们可以使用Java Swing。下面是一个简化的实现方案,展示如何加载BMP图片并在鼠标移动时绘制红色辅助线和显示坐标。

步骤概览

  1. 创建主窗口 :使用JFrame
  2. 加载和显示图片 :使用JLabelImageIcon,放在JScrollPane中以支持滚动。
  3. 绘制辅助线和显示坐标 :通过自定义JPanel,重写paintComponent方法,并处理鼠标事件。

示例代码

java 复制代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;

public class LabelDesignTool extends JFrame {
    private BufferedImage image;
    private ImagePanel imagePanel;

    public LabelDesignTool() {
        super("标签设计工具");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);
        initUI();
    }

    private void initUI() {
        imagePanel = new ImagePanel();
        JScrollPane scrollPane = new JScrollPane(imagePanel);
        add(scrollPane, BorderLayout.CENTER);

        JToolBar toolBar = new JToolBar();
        JButton loadImageButton = new JButton("加载图片");
        loadImageButton.addActionListener(e -> loadImage());
        toolBar.add(loadImageButton);
        add(toolBar, BorderLayout.NORTH);
    }

    private void loadImage() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("BMP Images", "bmp"));
        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                image = ImageIO.read(fileChooser.getSelectedFile());
                imagePanel.setImage(image);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    class ImagePanel extends JPanel {
        private Point mousePoint = new Point(0, 0);

        public void setImage(BufferedImage img) {
            image = img;
            setPreferredSize(new Dimension(img.getWidth(), img.getHeight()));
            repaint();
        }

        public ImagePanel() {
            addMouseMotionListener(new MouseMotionAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    mousePoint = e.getPoint();
                    repaint();
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (image != null) {
                g.drawImage(image, 0, 0, this);
                g.setColor(Color.RED);
                g.drawLine(mousePoint.x, 0, mousePoint.x, getHeight());
                g.drawLine(0, mousePoint.y, getWidth(), mousePoint.y);
                g.drawString("X: " + mousePoint.x + ", Y: " + mousePoint.y, mousePoint.x + 5, mousePoint.y - 5);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            LabelDesignTool tool = new LabelDesignTool();
            tool.setVisible(true);
        });
    }
}

说明

  • 加载图片:用户可以通过点击"加载图片"按钮来选择一张BMP图片,该图片将作为模板显示在工作区控件上。
  • 滚动查看:如果图片太大,用户可以通过垂直或水平滚动条查看图片的不同部分。
  • 绘制辅助线和显示坐标:当鼠标在图片上移动时,会显示红色的水平和垂直辅助线,并在辅助线附近显示鼠标的X和Y坐标。

请注意,这个示例代码主要集中在你的前两个要求上。根据你的具体需求,你可能需要进一步扩展和调整代码。

优化后V1.1

java 复制代码
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.util.ArrayList;

public class LabelDesignTool extends JFrame {
    private BufferedImage image;
    private ImagePanel imagePanel;
    private boolean addTextMode = false; // 标记是否处于添加文字模式
    private ArrayList<TextItem> texts = new ArrayList<>(); // 存储所有的文字项
    private Clipboard clipboard;
    private JButton addTextButton;
    // 设置字体样式、大小和样式
    private Font font = new Font("黑体", Font.BOLD, 48);
    public LabelDesignTool() {
        super("标签设计工具V1.1 (点击复制坐标。添加文字,鼠标左键添加文字,右键删选中的文字,按加减键改字体大小)QQ345139427");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        setSize(800, 600);
        clipboard= Toolkit.getDefaultToolkit().getSystemClipboard(); // 获取系统剪贴板
        initUI();
    }

    private void initUI() {
        imagePanel = new ImagePanel();
        JScrollPane scrollPane = new JScrollPane(imagePanel);
        add(scrollPane, BorderLayout.CENTER);

        JToolBar toolBar = new JToolBar();
        JButton loadImageButton = new JButton("加载图片");
        loadImageButton.addActionListener(e -> loadImage());
        toolBar.add(loadImageButton);

        addTextButton = new JButton("添加文字");
        addTextButton.addActionListener(e -> {addTextMode = !addTextMode;
            if(addTextMode){ addTextButton.setText("文字:"+font.getSize());}else{addTextButton.setText("添加文字");}         
            setFocusable(true); // Ensure the panel can receive focus 按键才有效 
            requestFocus(); // Request focus for the panel // 切换添加文字模式  
        });
        toolBar.add(addTextButton);

        add(toolBar, BorderLayout.NORTH);

        addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                char keyChar = e.getKeyChar();
                if (keyChar == '+' || keyChar == '=') {
                    font = new Font("黑体", Font.BOLD, font.getSize() + 1);
                    addTextButton.setText("文字:" + font.getSize());
                    repaint();
                } else if (keyChar == '-' || keyChar == '_') {
                    font = new Font("黑体", Font.BOLD, font.getSize() - 1);
                    addTextButton.setText("文字:" + font.getSize());
                    repaint();
                }
            }
        });


    }

    private void loadImage() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("BMP Images", "bmp"));
        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                image = ImageIO.read(fileChooser.getSelectedFile());
                imagePanel.setImage(image);
                setExtendedState(JFrame.MAXIMIZED_BOTH); // Set the window to open maximized
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    class ImagePanel extends JPanel {
        private Point mousePoint = new Point(0, 0);

        public void setImage(BufferedImage img) {
            image = img;
            setPreferredSize(new Dimension(img.getWidth(), img.getHeight()));
            repaint();
        }

        public ImagePanel() {
        


           addMouseMotionListener(new MouseMotionAdapter() {
               @Override
               public void mouseMoved(MouseEvent e) {
                   System.out.println("mouseMoved");
                   mousePoint = e.getPoint();
                   repaint();
               }

               @Override
               public void mouseDragged(MouseEvent e) {
                   System.out.println("mouseDragged");
                   //if (!addTextMode) {
                       mousePoint = e.getPoint();
                       // 拖动文字
                       for (TextItem text : texts) {
                           if (text.isDragging) {
                               text.x = e.getX();
                               text.y = e.getY();
                           }
                       }
                       repaint();
                  // }
               }
           });

           addMouseListener(new MouseAdapter() {
               @Override
               public void mousePressed(MouseEvent e) {
                   System.out.println("mousePressed");
                   //if (!addTextMode) {
                       // 检查是否点击了文字
                       for (TextItem text : texts) {
                           if (text.contains(mousePoint)) {
                               text.isDragging = true;
                           }
                       }
                  // }
               }
               @Override
               public void mouseClicked(MouseEvent e) {
                   System.out.println("mouseClicked");
                   if (SwingUtilities.isLeftMouseButton(e)) {
                       // Add text when left mouse button is clicked
                       if (addTextMode) {
                           texts.add(new TextItem(mousePoint.x, mousePoint.y, "F88888888888888", font));
                           repaint();
                       }
                   } else if (SwingUtilities.isRightMouseButton(e)) {
                       // Delete selected text when right mouse button is clicked
                       for (TextItem text : texts) {
                           if (text.contains(mousePoint)) {
                               texts.remove(text);
                               repaint();
                               break; // Exit loop after deleting one text item
                           }
                       }
                   }
                   // Save mouse coordinates to clipboard
                   String coordinates = mousePoint.x + ", " + mousePoint.y;
                   StringSelection selection = new StringSelection(coordinates);
                   clipboard.setContents(selection, null);
               }

               @Override
               public void mouseReleased(MouseEvent e) {
                   System.out.println("mouseReleased");
                   for (TextItem text : texts) {
                       text.isDragging = false;
                   }
               }
           });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
                if (image != null) {
                    g.drawImage(image, 0, 0, this);
                }
                g.setColor(Color.RED);
                g.drawLine(mousePoint.x, 0, mousePoint.x, getHeight());
                g.drawLine(0, mousePoint.y, getWidth(), mousePoint.y);
                g.drawString("X: " + mousePoint.x + ", Y: " + mousePoint.y, mousePoint.x + 5, mousePoint.y - 5);


                // 将字体应用到Graphics2D对象上
                g.setFont(font);
                if (addTextMode) {
                    g.drawString("F88888888888888", mousePoint.x, mousePoint.y+getFontMetrics(font).getHeight());
                }


                // 绘制所有的文字项
                for (TextItem text : texts) {
                    g.setColor(Color.black);
                    g.setFont(text.font);
                    g.drawString(text.text, text.x, text.y+text.getHeight());
                    if(text.contains(mousePoint))
                    {
                        g.setColor(Color.RED);
                        g.drawRect(text.x,text.y,text.getWidth(),text.getHeight());
                    }

                }

        }
    }

    class TextItem {
        int x;
        int y;
        String text;
        boolean isDragging;
        Font font;

        public TextItem(int x, int y, String text,Font font) {
            this.x = x;
            this.y = y;
            this.text = text;
            this.font=font;
        }
        public int getWidth()
        {
            return getFontMetrics(this.font).stringWidth(this.text);
        }
        public int getHeight()
        {
            return getFontMetrics(this.font).getHeight();
        }

        public boolean contains(Point point) {
            return point.x >= x && point.x <= x + getWidth() && point.y >= y && point.y <= y + getHeight(); // 假设文字高度为20
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            LabelDesignTool tool = new LabelDesignTool();
            tool.setVisible(true);
        });
    }
}
相关推荐
confiself8 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq041513 分钟前
J2EE平台
java·java-ee
XiaoLeisj20 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man23 分钟前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*24 分钟前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
半桶水专家25 分钟前
go语言中package详解
开发语言·golang·xcode
llllinuuu26 分钟前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s26 分钟前
Golang--协程和管道
开发语言·后端·golang
王大锤439128 分钟前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
为什么这亚子29 分钟前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算