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图片并在鼠标移动时绘制红色辅助线和显示坐标。
步骤概览
- 创建主窗口 :使用
JFrame
。 - 加载和显示图片 :使用
JLabel
和ImageIcon
,放在JScrollPane
中以支持滚动。 - 绘制辅助线和显示坐标 :通过自定义
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);
});
}
}