基本概念类似于任何常规的Swing形式。您只需要添加一些
额外的工作即可将它们组合在一起。
您需要决定的第一件事是是否需要多线支持?
下面的示例简单地使用JLayeredPane,提供自由布局和
使用自定义Jtextarea提供可编辑字段。
整洁的是,调整大小
和“可重新编辑性”一样,多数情况下都由您来照顾,只需单击文本,您就会明白我的
意思。
在此处输入图片说明
我将重新定位由您决定;)
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(); } }}


