Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPanel中显示的矩形区域内的图像上写入文本_Java_Image_Swing - Fatal编程技术网

Java 如何在JPanel中显示的矩形区域内的图像上写入文本

Java 如何在JPanel中显示的矩形区域内的图像上写入文本,java,image,swing,Java,Image,Swing,要在图像上绘制文本。在第一次鼠标单击显示的矩形区域时,一旦输入文本,文本应以矩形形状绘制,矩形应自动调整大小,文本显示在附加图像中 基本概念与任何普通挥杆形式类似。你只需要增加一点额外的工作就可以把所有的工作都整合起来 您需要决定的第一件事是您是否需要多线支持 下面的示例使用一个JLayeredPane,提供自由布局,使用一个自定义JTextArea提供可编辑字段 关于这一点,最巧妙的是,调整大小主要是为你,因为是“重新编辑”,只要点击文本上的后退,你就会明白我的意思 我将把重新定位留给你;)

要在图像上绘制文本。在第一次鼠标单击显示的矩形区域时,一旦输入文本,文本应以矩形形状绘制,矩形应自动调整大小,文本显示在附加图像中


基本概念与任何普通挥杆形式类似。你只需要增加一点额外的工作就可以把所有的工作都整合起来

您需要决定的第一件事是您是否需要多线支持

下面的示例使用一个
JLayeredPane
,提供自由布局,使用一个自定义
JTextArea
提供可编辑字段

关于这一点,最巧妙的是,调整大小主要是为你,因为是“重新编辑”,只要点击文本上的后退,你就会明白我的意思

我将把重新定位留给你;)


请发布一个帖子,准确地说明你做了什么以及你在哪里被卡住了,否则问题可能会被关闭,因为它不是一个真正的问题,你可以使用透明的JTextArea。将“DocumentListener”添加到区域的文档中。当键入内容时,调整区域大小。现在我能够使用g.drawString(text,(int)p.getX(),(int)p.getY()绘制文本;在图像上,但我想使用键盘输入直接在图像上绘制文本。感谢您宝贵的回答。感谢您提出的有趣问题;)
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();
        }

    }

}