2012-11-26 4 views
0

이미지 위에 텍스트를 그립니다. 첫 번째 마우스를 클릭하면 사각형 영역이 표시됩니다. 텍스트를 입력하자마자 텍스트는 사각형 모양으로 그려야하고 사각형은 첨부 된 이미지에 표시된 텍스트로 자동 크기 조정되어야합니다.JPanel에 표시되는 사각형 영역 내에서 이미지 위에 텍스트를 쓰는 방법

enter image description here

+1

게시하시기 바랍니다 [SSCCE] (http://sscce.org) 당신이 한 일을 정확히 보여주고 당신을 갇혀 있거나 질문이 닫힐 수 있습니다. 실제 질문이 아니기 때문에 IMO –

+1

투명 JTextArea를 사용할 수 있습니다. 영역의 문서에 'DocumentListener'를 추가합니다. 무언가가 타자를 친 때 지역 크기를 적응 시키십시오. – StanislavL

+0

지금 g.drawString (텍스트, (int) p.getX(), 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

관련 문제