当前位置: 首页 > 面试题库 >

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

刘元青
2023-03-14
问题内容

想要在图像上绘制文本。第一次单击鼠标时,将显示一个矩形区域,
一旦输入文本,则应以矩形形状绘制文本,并且矩形
应自动调整大小,如所附图像中所示。


问题答案:

基本概念类似于任何常规的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();
        }

    }

}


 类似资料:
  • 本文向大家介绍openCV提取图像中的矩形区域,包括了openCV提取图像中的矩形区域的使用技巧和注意事项,需要的朋友参考一下 改编自详解利用OpenCV提取图像中的矩形区域(PPT屏幕等) 原文是c++版,我改成了python版,供大家参考学习。 主要思想:边缘检测—》轮廓检测—》找出最大的面积的轮廓—》找出顶点—》投影变换 运行效果 用到的图片 以上就是本文的全部内容,希望对大家的学习有所帮助

  • 问题内容: 在JPanel上显示jpg图像(从本地文件夹加载)的最合适的图像类型是什么? 干杯。 问题答案:

  • 问题内容: 我有一张根据某些数据计算得出的图表,绘制在matplotlib中。我想在此图的全局最大值周围绘制一个矩形区域。我试过,但通话时似乎没有出现矩形 那么,如何在matplotlib图上绘制矩形区域?谢谢! 问题答案: 最可能的原因是在调用axhspan时将数据单元用作x参数。从函数的文档(我的重点): y坐标以数据单位为单位, x坐标以轴(相对于0-1)为单位 。 因此,任何向左拉伸为0或

  • 我正在用Java和JAVAFX开发一个国际象棋游戏。我的棋盘是一个JAVAFX组,包含一个正方形数组。我的正方形继承自JAVAFX rectangle类。我想在这些方块里面画一个图像(棋子的图像),但是我似乎找不到方法。当我使用setfill来绘制图案时,正方形的颜色消失了,这不是我想要的,我希望图像是透明的,并绘制在每个正方形的顶部。有什么想法吗?

  • 我正在尝试使用一个菜单栏,使用户能够选择一个文件,并在JPanel中显示它,图像应该完全适合JPanel。但是JFileChooser在从对话框中成功选择文件时不会显示任何内容。我试着参考了许多链接:如何向JPanel添加图像?浏览图像文件并使用Java Swing显示它,但没有任何结果。请帮帮忙。以下是我的代码: 更新后的代码如下:

  • 下图会告诉你我想要什么。 我有图像中矩形的信息(宽度,高度,中心点和旋转度)。现在,我想写一个脚本来剪切它们并将它们保存为图像,但也要将它们拉直。就像这样,我想从图像内部显示的矩形转到外部显示的矩形。 我正在使用OpenCV Python。请告诉我实现这一点的方法。 请展示一些代码,因为OpenCVPython的例子很难找到。