如何在JPanel中显示的矩形区域内的图像上书写文字

想在图像上绘制文字。 在第一次鼠标单击一个矩形区域显示时,只要输入文本,文本应该用矩形shap绘制,矩形应该自动resize,文本显示在附加图像中。

在此处输入图像描述

基本概念就像任何普通的Swingforms一样。 你只需要添加一些额外的工作来将它们全部拉到一起。

你需要决定的第一件事是你想要多线支持吗?

下面的示例simple使用JLayeredPane来提供免费布局,使用自定义JTextArea来提供可编辑字段。

关于这一点的好处是,resize主要是照顾你,就像“可重新编辑”一样,只需点击文本,你就会明白我的意思。

在此处输入图像描述

我会让你重新定位;)

 public class TextOverImage { public static void main(String[] args) { new TextOverImage(); } public TextOverImage() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new ImagePane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ImagePane extends JLayeredPane { private BufferedImage background; public ImagePane() { setFocusable(true); try { background = ImageIO.read(new File("Your/image/here")); } catch (Exception e) { e.printStackTrace(); } addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { Component focusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); if (!(focusOwner instanceof OverlayEditor)) { OverlayEditor field = new OverlayEditor(); field.setLocation(e.getPoint()); add(field); invalidate(); repaint(); field.requestFocusInWindow(); } else { requestFocusInWindow(); } } }); InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); ActionMap am = getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel"); am.put("cancel", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { Component focusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); if (focusOwner instanceof OverlayEditor) { remove(focusOwner); invalidate(); repaint(); } } }); } @Override public Dimension getPreferredSize() { return new Dimension(400, 400); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (background != null) { int x = (getWidth() - background.getWidth()); int y = (getHeight() - background.getHeight()); g.drawImage(background, x, y, this); } } } public class OverlayEditor extends JTextArea { public OverlayEditor() { super(1, 10); setBorder(null); setForeground(Color.WHITE); setOpaque(false); setSize(getPreferredSize()); getDocument().addDocumentListener(new DocumentListener() { public void update() { setSize(getPreferredSize()); } @Override public void insertUpdate(DocumentEvent e) { update(); } @Override public void removeUpdate(DocumentEvent e) { update(); } @Override public void changedUpdate(DocumentEvent e) { update(); } }); addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { setBorder(new LineBorder(Color.WHITE)); repaint(); } @Override public void focusLost(FocusEvent e) { setBorder(null); repaint(); } }); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); if (hasFocus()) { g2d.setColor(new Color(0, 0, 0, 32)); g2d.fill(new Rectangle(getWidth(), getHeight())); } g2d.dispose(); } } }