想在图像上绘制文字。在第一次鼠标单击一个矩形区域显示时,只要输入文本,文本应该用矩形shap绘制,矩形应该自动调整大小,文本显示在附加图像中。
答案 0 :(得分:5)
基本概念就像任何普通的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();
}
}
}