2012-11-26 61 views
0

中显示的矩形区域内的图像上写文字,以便在图像上绘制文字。在第一次鼠标点击一个矩形区域显示时,只要输入文本,文本应该在矩形shap中绘制,矩形应该自动调整大小与附加图像中显示的文本。如何在JPanel

enter image description here

+1

请张贴[SSCCE(http://sscce.org)准确地告诉你做了什么,在哪里你卡住了,或者问题可能会被关闭,因为它不是一个真正的问题IMO –

+1

您可以使用透明的JTextArea。将“DocumentListener”添加到该区域的文档中。当输入内容时,调整区域大小。 – StanislavL

+0

现在我可以使用g.drawString(text,(int)p.getX(),(int)p.getY())来绘制文本。在图像上,但我想使用键盘输入直接在图像上绘制文本。 – NSR

回答

5

的基本概念是像任何正常摇摆形式。你只需要添加一些额外的工作来将它们放在一起。

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

下面的示例简单地使用JLayeredPane来提供自由布局,并使用自定义JTextArea来提供可编辑字段。

对此的整洁的事情是调整大多是照顾你,因为是“重新编辑”,只需点击文本,你会明白我的意思。

enter image description here

我会离开重新定位给你;)

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(); 
     } 

    } 

} 
+0

谢谢,您的宝贵回应。 – NSR

+0

感谢您提出一个有趣的问题;) – MadProgrammer